强制Doctrine创建type =“guid”作为VARCHAR(255)而不是CHAR(36)

时间:2016-10-19 16:08:12

标签: mysql symfony doctrine-orm doctrine

我正在尝试向我的Symfony项目中添加一个新实体,该项目使用GUID字段映射到另一个实体:

// OtherEntity

/**
 * @ORM\Id
 * @ORM\Column(name="guid", type="guid", unique=true)
 */
protected $guid;


// New Entity

/**
 * @ORM\ManyToOne(targetEntity="OtherEntity")
 * @ORM\JoinColumn(name="other_guid", referencedColumnName="guid", nullable=false, onDelete="SET NULL")
 */
protected $otherEntity;

Doctrine转储以下SQL staments,以便在使用NewEntity时为php app/console doctrine:schema:update --dump-sql创建表:

CREATE TABLE new_entity (guid CHAR(36) NOT NULL COMMENT '(DC2Type:guid)', other_guid CHAR(36) NOT NULL COMMENT '(DC2Type:guid)', ...

ALTER TABLE new_entity ADD CONSTRAINT FK_D3D1CD16A7FC4818 FOREIGN KEY (other_guid) REFERENCES other_entity (guid) ON DELETE SET NULL;

当运行doctrine:schema:update --force时,我收到以下错误:

[Doctrine\DBAL\Exception\DriverException]                                                                                                                                     
An exception occurred while executing 'ALTER TABLE new_entity ADD CONSTRAINT FK_D3D1CD16A7FC4818 FOREIGN KEY (other_guid) REFERENCES other_entity (guid) ON DELETE SET NULL':  
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint 

经过一番挖掘,我发现,type="guid"被翻译为CHAR(36)是问题所在。如果使用VARCHAR(255)代替,一切正常。

问题是,guid表的other_entity字段是VARCHAR(255)。因此,CHAR(36)中的new_entity字段无法映射到另一种类型的字段。

我最近更新了我的Symfony项目:

doctrine/dbal               v2.4.4  --> 2.5.5
doctrine/doctrine-bundle    v1.2.0  --> 1.6.2           
doctrine/orm                v2.4.8  --> 2.5.5
symfony/symfony             v2.7.7  --> v2.8.12

在旧配置下运行doctrine:schema:updateGUID字段创建为VARCHAR(255),而新配置将其创建为CHAR(36) < / p>

使用CHAR(36)是有道理的,因为这是GUID的长度。但是新格式带来了前面描述的问题:不再可能映射到相同类型的旧字段(guid)。

我不明白,为什么doctrine:schema:update也不会将现有字段更新为新格式。

我有什么办法可以强迫Doctrine将所有现有字段更新为CHAR(36),还是继续将GUID创建为VARCHAR(255)

1 个答案:

答案 0 :(得分:0)

尝试为相关字段指定相同的长度,然后添加options={"fixed" = true}