没有外键约束的Doctrine 2关联

时间:2012-04-08 15:03:16

标签: php database symfony doctrine-orm

我正在将旧版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);

我该如何避免这种情况?

6 个答案:

答案 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")