11

我正在将遗留的 PHP 应用程序转换为 Symfony 2。目前应用程序数据不是很一致,所以我想避免创建外键约束。我的“产品”实体类中有以下注释:

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);

我怎样才能避免这种情况?

4

6 回答 6

13

我最近不得不经历同样的过程,幸运的是有一个简单的解决方案,只需添加nullable=true到列的注释中。

只要现有数据有效,这将起作用,在我的情况下,我必须将 0 更改为 NULL,并将不再存在的键更改为 NULL。

于 2013-06-06T14:02:28.683 回答
8

基本上你不能阻止生成 sql 命令。至少不是不深入研究 Doctrine 代码。

但是,您不需要将约束实际应用于您的数据库。没有它们,D2 也能正常工作。

于 2012-04-08T15:12:01.513 回答
0

您应该省略 ManyToMany 和 JoinColumn 定义,并使用扩展自动生成的产品存储库的公共 getManufacturer 方法处理自定义产品存储库中的制造商属性。

于 2012-06-12T12:41:23.827 回答
0

我对相同的命令有问题。我得到了例外:

SQLSTATE[HY000]: 一般错误: 1005 无法创建表 'xxx.#sql-66c_3e' (errno: 150)

对我来说,它有助于将该列声明为唯一(在您的案例 ID 中)。

现在app/console doctrine:schema:update再次运行良好。

于 2013-06-06T13:03:28.413 回答
0

您必须将丢失的外键设置为空,然后您可以设置约束。以下查询为您提供数据集中要更改的 ID:

select p.id from product p
left join manufacturer m on m.id=p.manufakturer_id
where m.id is null
于 2016-11-09T08:07:51.257 回答
-2

尝试添加 onDelete="CASCADE" 之类的

* @ORM\JoinColumn(name="manufacturer_id", referencedColumnName="id", onDelete="CASCADE")
于 2014-05-31T08:05:21.580 回答