我有一个实体主题,该实体主题先前设置了属性(id,name(和主题表现在已填充。由于该项目的发展,我需要一个新的属性目录。但是事实是,此属性必须是非零的。
class Topic
{
/**
* @var integer
*
* @ORMColumn(name="id", type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var MyBundleEntityCatalog
* @ORMManyToOne(targetEntity="MyBundleEntityCatalog")
* @ORMJoinColumns({
* @ORMJoinColumn(name="catalogId", referencedColumnName="id", nullable=false)
* })
* @AssertNotBlank()
*/
private $catalog;
/**
* @var string
*
* @ORMColumn(name="name", type="string", length=255, nullable=false)
* @AssertNotBlank()
*/
private $name;
}
doctrine:schema:update --dump-sql
还可以:
ALTER TABLE topic ADD catalogId INT NOT NULL;
ALTER TABLE topic ADD CONSTRAINT FK_9D40DE1B19B71A2D FOREIGN KEY (catalogId) REFERENCES catalog (id);
CREATE INDEX IDX_9D40DE1B19B71A2D ON topic (catalogId);
问题是,如果我做doctrine:schema:update --force
,我有一个错误,说我不能。
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`simspeaker`.`#sql-3d2
_71`, CONSTRAINT `FK_9D40DE1B19B71A2D` FOREIGN KEY (`catalogId`) REFERENCES `catalog` (`id`))
我设法解决这个错误的唯一方法是在一步中做事:
- 我将目录字段设置为无效
- 我将默认目录值设置为整个表
- 我将目录字段设置为非无效
充其量不是最佳的。有没有办法在"一通"中执行这种修改?
这里似乎没有答案,这是Google上的第一个结果,所以我只是写一个快速的结果。
在您的迁移中:
- 首先将新字段添加为无效
- 使用适当的数据更新新字段
- 将新字段更改为无效
voila。
我将在中间步骤中添加一个警告,写SQL查询,不要使用学说,因为这将来会引起头痛。实体可能会以与您的代码不相容的方式改变。然后,您的迁移将会破裂,您会感到难过。我不想让你难过。
当然,您可以立即使用学说迁移
问题是合乎逻辑的,如果键(在您的情况下,键为0(,则无法创建外键。