我正在将旧版PHP应用程序转换为Symfony 2.目前应用程序数据不是很一致,所以我想避免创建外键约束。我在“Product”实体类中有以下注释:
class Product {
// some definitions
/**
* @ORM\ManyToOne(targetEntity="Manufacturer")
* @ORM\JoinColumn(name="manufacturer_id", referencedColumnName="id" )
*/
private $Manufacturer;
}
当我app/console doctrine:schema:update
时,我得到了SQL命令
ALTER TABLE products ADD CONSTRAINT FK_F6FA18741C3BF575
FOREIGN KEY (manufacturer_id) REFERENCES manufacturer(id);
我该如何避免这种情况?
答案 0 :(得分:13)
我最近必须经历相同的过程,幸运的是有一个简单的解决方案,只需将nullable=true
添加到列的注释中。
只要现有数据有效,这将有效,在我的情况下,我必须将0更改为NULL并将不再存在的密钥更改为NULL。
答案 1 :(得分:6)
基本上,您无法阻止生成sql命令。至少没有深入研究Doctrine代码。
但是,您不需要将约束实际应用于数据库。如果没有它们,D2将正常工作。
答案 2 :(得分:0)
您应该省略ManyToMany和JoinColumn定义,并使用扩展自动生成的产品存储库的公共getManufacturer方法处理自定义产品存储库中的Manufacturer属性。
答案 3 :(得分:0)
我遇到了同样命令的问题。我得到了例外:
SQLSTATE [HY000]:常规错误:1005无法创建表'xxx。#sql-66c_3e'(错误号:150)
对我来说,它有助于将列声明为唯一(在您的案例中为id)。
现在app/console doctrine:schema:update
再次正常运行。
答案 4 :(得分:0)
您必须将丢失的外键设置为null,然后才能设置contstraint。以下查询为您提供要更改的数据集中的ID:
select p.id from product p
left join manufacturer m on m.id=p.manufakturer_id
where m.id is null
答案 5 :(得分:-2)
尝试添加onDelete =“CASCADE”,如
* @ORM\JoinColumn(name="manufacturer_id", referencedColumnName="id", onDelete="CASCADE")