Symfony2添加新的学说字段类型

时间:2013-11-26 16:39:09

标签: symfony doctrine-orm varbinary dbal custom-type

我在这件事上失去了3个小时,仍然无法弄清楚什么是错的,我试图添加一个VARBINARY字段类型,并且教义在生成新实体时向我显示该字段作为选项,但问题是当我做{ {1}}然后它给了我一个错误,

php app/console doctrine:schema:update --force

这是我的VARBINARY类型

    [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

我也在启动功能

中注册了它
    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);
    }

}

2 个答案:

答案 0 :(得分:0)

您必须提供field length,例如:

 CREATE TABLE t (c VARBINARY(8));

查看Doctrine文档,了解如何提供[硬编码]这样的价值。

答案 1 :(得分: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类型。