2

私はこのことで3時間を失いましたが、何が問題なのかまだわかりません.VARBINARYフィールドタイプを追加しようとしています.Doctrineは新しいエンティティを生成するときにそのフィールドをオプションとして表示しますphp app/console doctrine:schema:update --force.エラー、

    [DoctrineDBAL\DBALException]
An exception occured while executing 'CREATE TABLE Test (id INT AUTO_INCREMENT NOT NULL, name VARBINARY NOT NULL, PRIMARY KEY(id))


SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax;check the manual that corresponds to your MySQL server version for the right sytax to use near 'NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci EN' at line 1

これは私の VARBINARY 型クラスです

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

class VarBinaryType extends Type {

    const VARBINARY = 'VARBINARY';

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

    public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform) {
        return $platform->getDoctrineTypeMapping('VARBINARY');
    }

    public function convertToDatabaseValue($value, AbstractPlatform $platform) {
        return ($value === null)? null : base64_encode($value);
    }

    public function convertToPHPValue($value, AbstractPlatform $platform) {
        return ($value === null)? null : base64_decode($value);
    }

}

また、ブート機能内に登録しました

$connection = $this->container->get('doctrine.orm.entity_manager')->getConnection();
        if(!Type::hasType('VARBINARY'))
        {

            Type::addType('VARBINARY', 'Uapi\\CoreBundle\\System\\DBALType\\VarBinaryType');
            $connection->getDatabasePlatform()->registerDoctrineTypeMapping('VARBINARY', 'VARBINARY');
        }
4

2 に答える 2

0

moonwave99 のアドバイスと併せて、ここに解決策があります。

VarBinaryType クラスで、getSQLDeclaration 関数に次のコードを使用します。

public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform) {
    if(isset($fieldDeclaration['length'])){
        return "VARBINARY (".$fieldDeclaration['length'].")";
    }else{
        return "VARBINARY (1024)";
    }
}

ソースコードを調べてこの答えを見つけました。これはドキュメントよりも役に立ちました。上記のコードを使用すると、MySQL で機能します。実装によっては、使用しているデータベース プラットフォームに合わせて調整する必要がある場合があります。

Doctrine の古いビルドに関してこの解決策を探している人のために、ここに投稿しています。現在、最新バージョンは BINARY と VARBINARY の両方のタイプをサポートしています。

于 2015-01-07T16:24:27.783 に答える
0

フィールドの長さを指定する必要があります。例:

 CREATE TABLE t (c VARBINARY(8));

そのような値を [ハードコーディングから] 提供する方法については、Doctrine のドキュメントを参照してください。

于 2013-11-26T16:43:55.390 に答える