Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 原则2无外键约束的关联_Php_Database_Symfony_Doctrine Orm - Fatal编程技术网

Php 原则2无外键约束的关联

Php 原则2无外键约束的关联,php,database,symfony,doctrine-orm,Php,Database,Symfony,Doctrine Orm,我正在将一个遗留的PHP应用程序转换为Symfony 2。应用程序数据目前不是很一致,因此我希望避免创建外键约束。我的“产品”实体类中有以下注释: class Product { // some definitions /** * @ORM\ManyToOne(targetEntity="Manufacturer") * @ORM\JoinColumn(name="manufacturer_id", referencedColumnName="id" ) */

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

class Product {

  // some definitions

  /**
   * @ORM\ManyToOne(targetEntity="Manufacturer")
   * @ORM\JoinColumn(name="manufacturer_id", referencedColumnName="id" )
   */
  private $Manufacturer;
}
当我执行
app/console原则:schema:update
时,我得到了SQL命令

 ALTER TABLE products ADD CONSTRAINT FK_F6FA18741C3BF575 
   FOREIGN KEY (manufacturer_id) REFERENCES manufacturer(id);

如何避免这种情况?

基本上,您无法阻止生成sql命令。至少在没有深入研究教条的情况下


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

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

我在使用相同命令时遇到问题。我得到了一个例外:

SQLSTATE[HY000]:一般错误:1005无法创建表“xxx.#sql-66C3e”(错误号:150)

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


现在
app/console原则:schema:update再次正常运行。

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

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

尝试添加onDelete=“CASCADE”之类的


您必须将丢失的外键设置为null,然后才能设置contstraint。以下查询提供要更改的数据集中的ID:

select p.id from product p
left join manufacturer m on m.id=p.manufakturer_id
where m.id is null

是的,但是我不能再使用命令
app/console条令:schema:update--force
,因为更新在尝试执行FK约束时停止。这个答案与@Pier Luc Gendreau的答案结合在一起,为我提供了窍门。如果希望Doctrine2管理数据库关系,则需要清除缺失关系中的数据,然后才能创建缺失的约束。我已将其添加到我的
JoinColumn
注释中,但外键约束仍在创建中。与@flu相同-不走运,从那以后我就没有使用过Doctrine,但是你确定它是被创建的,还是已经存在并且没有被删除。如果我试图通过命令行使用doctrine2生成多对多关系表,那么它对我不起作用。作为替代方案,我使用了一个查询来检测数据库中的所有外键&删除它们()来强化这个答案——对于无论如何都要创建外键并且架构更新失败的情况——这是因为架构被部分更新并且填充了无效的连接id。检查数据库中的联接表,并通过删除添加的列(该列可能包含0而不是NULL)进行还原,然后在将nullable=true添加到联接列注释后重新运行架构更新。外键仍将被创建,但不会失败,因为不会有无效值。
select p.id from product p
left join manufacturer m on m.id=p.manufakturer_id
where m.id is null