2013-11-26 32 views
2

我在這件事上失去了3個小時,仍然無法弄清楚什麼是錯的,iam試圖添加一個VARBINARY字段類型,並且doctrine在生成新實體時顯示該字段爲選項,但是問題是,當我這樣做php app/console doctrine:schema:update --force那麼它給了我一個錯誤,Symfony2 add new doctrine字段類型

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

回答

0

你必須提供field length,例如:

CREATE TABLE t (c VARBINARY(8)); 

查找到學說文檔瞭解如何提供這樣的值進行硬編碼的。

+0

感謝您的回覆,現在我想goig再花3個小時試圖找出如何添加字段長度順便說一句。文檔很糟糕 – user3035443

0

結合moonwave99的建議,這裏有一個解決方案。

在你VarBinaryType類,使用的getSQLDeclaration功能驗證碼:

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

我發現這個答案通過源代碼,這是比文檔更多的幫助下去。使用上面的代碼適用於MySQL。根據您的實施情況,您可能需要針對您正在使用的數據庫平臺進行調整。

我在這裏發佈這個爲那些正在尋找這個解決方案關於老教條的構建。最新版本當前支持BINARY和VARBINARY類型。