我遇到运行doctrine:schema:update --force的问题,原因是forgeign键约束问题。
[Doctrine\DBAL\DBALException] An exception occurred while executing 'ALTER TABLE Product ADD CONSTRAINT FK_1CF73D312ADD6D8C FOREIGN KEY (supplier_id) REFERENCES Supplier (id) ON DELETE SET NULL':
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`wic_dev`.`#sql-5c0 a_1a12`, CONSTRAINT `FK_1CF73D312ADD6D8C` FOREIGN KEY (`supplier_id`) REFERENCES `Supplier` (`id`) ON DELETE SET NULL)
[PDOException] SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`wic_dev`.`#sql-5c0 a_1a12`, CONSTRAINT `FK_1CF73D312ADD6D8C` FOREIGN KEY (`supplier_id`) REFERENCES `Supplier` (`id`) ON DELETE SET NULL)
我有两个表正在创建此错误:产品和供应商。
产品可以有1个供应商,供应商可以有很多产品。
以下是我设置实体的方法:
产品实体:
/**
* @ORM\ManyToOne(targetEntity="WIC\SupplierBundle\Entity\Supplier", inversedBy="products", fetch="EAGER")
* @ORM\JoinColumn(name="supplier_id", referencedColumnName="id", nullable=true, onDelete="SET NULL")
* @Common\Versioned
* @Assert\NotBlank(message="Supplier Cannot Be Blank")
*/
protected $supplier;
供应商实体
/**
* @ORM\OneToMany(targetEntity="WIC\ProductBundle\Entity\Product", mappedBy="supplier", cascade={"all"})
*/
protected $products;
我目前在每张表中都有数据。我知道有些产品缺少供应商,供应商缺少产品。
我做错了什么,如何解决这个问题?我需要运行此架构更新,以便我的其他表也将更新。
非常感谢你的帮助!
答案 0 :(得分:5)
以下是我解决问题的方法。在我的产品表中,我将值存储为" 0"如果找不到供应商。因为它是两个表之间的多关系和onetomany关系,所以它之间存在冲突,因为supplier_id永远不会为0,0与供应商表中的任何id都不匹配。我不得不更新products表以将0的任何值设置为NULL,这使架构更新起作用。
答案 1 :(得分:0)
在大多数情况下,只需确保为您尝试与之建立关系的实体提供use
声明即可。
当2个实体不在同一个包中并因此需要自动加载它们时,通常会发生这种情况。要使错误消失,只需执行以下操作:
在您的产品实体中,请勿忘记:
use WIC\SupplierBundle\Entity\Supplier;