我有一个表product,这些表中的项目在诸如cart_item和order_item以及shipping_item等表中被引用。
所有这些引用都是可选的(product_id 在这些表中设置为可为空)。
我需要有一种方法来删除产品并仍然保留其他表的记录。我能想到的一种方法是进入所有这些表,将 product_id 设置为 null,然后返回 product 表进行删除。但是,由于我可能不知道引用产品的所有表(许多其他捆绑包可能具有引用此产品的实体),有没有办法让我知道所有这些关联以循环并设置为 null?
(或者也许有更好的方法?)
PS:这是一个购物车的想法,所有者可能希望删除过期产品进行清理,但对于订购的、已发货的物品,他们仍然需要保留记录。
编辑1:
这是 OrderItem 实体中产品引用的定义:
/**
* @var \Product
*
* @ORM\ManyToOne(targetEntity="Product")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="product_id", referencedColumnName="id")
* })
*/
private $product;
我得到的错误:
PDOException:SQLSTATE [23000]:完整性约束违规:1451 无法删除或更新父行:外键约束失败(
test
.order_item
, C ONSTRAINTfk_order_item_product1
FOREIGN KEY (product_id
) REFERENCESproduct
(id
) ON DELETE NO ACTION ON UPDATE NO ACTION)
编辑2:
我最初将 onupdate="SET NULL" 设置为 order_item 实体,并认为这就足够了,但不是:
/**
* @var \Product
*
* @ORM\ManyToOne(targetEntity="Product")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="product_id", referencedColumnName="id", nullable=true, onDelete="SET NULL")
* })
*/
private $product;
之后,我还必须更新数据库模式。