services - symfony tags




Doctrine custom type ändert immer die Tabelle (3)

Ich habe einen benutzerdefinierten Typ wie folgt hinzugefügt:

namespace My\SuperBundle\Types;

use Doctrine\DBAL\Types\Type;
use Doctrine\DBAL\Platforms\AbstractPlatform;

class Money extends Type
{
    const MONEY = 'money';

    public function getSqlDeclaration(
        array $fieldDeclaration,
        AbstractPlatform $platform
    ) {
        return 'DECIMAL(10,2)';
    }

    public function getName()
    {
        return self::MONEY;
    }
}

Und in meiner Anwendung booten:

namespace My\SuperBundle;

use Doctrine\DBAL\Types\Type;
use My\SuperBundle\Types\Money;

class MyBSuperBundle extends Bundle
{
    public function boot()
    {
        //add custom quantity and wight types
        $em = $this->container->get('doctrine.orm.entity_manager');

        if(!Type::hasType(Money::MONEY)) {
            Type::addType(Money::MONEY, 'My\SuperBundle\Types\Money');
        }
    }
}

Jedes Mal, wenn ich die Datenbank aktualisiere mit:

php app/console doctrine:schema:update --dump-sql

Ich bekomme immer folgendes:

ALTER TABLE product_price CHANGE price price DECIMAL(10,2) DEFAULT NULL

Ansonsten funktioniert alles super gut. Die Felder in der DB sind korrekt. Gibt es einen Grund, warum die Doktrin mit den gleichen Daten aktualisiert wird?


Sie sagen der DBAL-Plattform nicht über Ihren Typ, also können die DBL-Schema-Introspektions-Dienstprogramme dies natürlich nicht erkennen. Um den Typ zu registrieren, können Sie Folgendes tun:

use Doctrine\DBAL\Types\Type;
use My\SuperBundle\Types\Money;

class MyBSuperBundle extends Bundle
{
    public function boot()
    {
        /* @var $em \Doctrine\ORM\EntityManager */
        $entityManager = $this->container->get('doctrine.orm.entity_manager');

        if( ! Type::hasType(Money::MONEY)) {
            Type::addType(Money::MONEY, 'My\SuperBundle\Types\Money');
            $entityManager
                ->getConnection()
                ->getDatabasePlatform()
                ->registerDoctrineTypeMapping('decimal', Money::MONEY);
        }
    }
}

Dies sollte die DBAL davon abhalten, sich über Schemaunterschiede zu beschweren.



Ich hatte das gleiche Problem mit ZF2.

Ich löste es, indem ich den Bindestrich in meinem benutzerdefinierten Typnamen entfernte.

Falsch:

'doctrine_type_mappings' => [
    'custom-type' => 'custom-type'
],

Gut:

'doctrine_type_mappings' => [
    'customtype' => 'customtype'
],

Weitere Details zur Implementierung in Zend Framework 2: https://github.com/doctrine/DoctrineORMModule/blob/master/docs/EXTRAS_ORM.md

Ich hoffe, das kann jemandem helfen.





doctrine2