2

我在这件事上浪费了 3 个小时,仍然无法弄清楚出了什么问题,我正在尝试添加一个 VARBINARY 字段类型,并且学说在生成新实体时向我显示了该字段作为一个选项,但问题是当我这样做时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 回答