11

次のようなカスタムタイプを追加しました:

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;
    }
}

そして、私のアプリケーションの起動で:

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');
        }
    }
}

ただし、データベースを次のように更新するたびに:

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

私は次のことを続けています:

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

それを除けば、すべてが非常にうまく機能します。DB のフィールドは正しいです。doctrine が同じデータで更新し続ける理由はありますか?

4

4 に答える 4

13

メソッドをオーバーライドしてrequiresSQLCommentHint(AbstractPlatform $platform)を返す必要がありますtrue。そのように、doctrine はカスタムタイプを記憶します。

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;
    }

    /**
     * @inheritdoc
     */
    public function requiresSQLCommentHint(AbstractPlatform $platform)
    {
        return true;
    }
}

出典: Doctrine Type Inference の詳細については、列のコメントを使用してください

于 2015-01-28T10:12:35.057 に答える
3

DBAL プラットフォームにタイプを伝えていないため、明らかに、DBAL スキーマ イントロスペクション ユーティリティはそれを認識できません。タイプを登録するには、次の操作を実行できます。

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);
        }
    }
}

これにより、DBAL がスキーマの違いについて不平を言うのを止める必要があります。

于 2013-03-29T12:05:59.097 に答える
1

ZF2でも同じ問題がありました。

カスタムタイプ名のハイフンを削除して解決しました。

違う:

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

良い:

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

Zend Framework 2 での実装の詳細: https://github.com/doctrine/DoctrineORMModule/blob/master/docs/EXTRAS_ORM.md

これが誰かを助けることができることを願っています。

于 2016-07-22T15:07:35.423 に答える