我正在尝试向我的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:update
,GUID
字段创建为VARCHAR(255)
,而新配置将其创建为CHAR(36)
。 < / p>
使用CHAR(36)
是有道理的,因为这是GUID的长度。但是新格式带来了前面描述的问题:不再可能映射到相同类型的旧字段(guid)。
我不明白,为什么doctrine:schema:update
也不会将现有字段更新为新格式。
我有什么办法可以强迫Doctrine将所有现有字段更新为CHAR(36)
,还是继续将GUID
创建为VARCHAR(255)
?
答案 0 :(得分:0)
尝试为相关字段指定相同的长度,然后添加options={"fixed" = true}