テーブル商品があります。これらのテーブルのアイテムは、 cart_itemやorder_item、shipping_itemなどのテーブルで参照されています。
これらの参照はすべてオプションです(product_idはこれらのテーブルでnull許容に設定されています)。
製品を削除し、他のテーブルのレコードを保持する方法が必要です。私が考えることができる1つの方法は、これらすべてのテーブルに移動し、product_idをnullに設定してから、製品テーブルに戻って削除することです。ただし、製品を参照しているすべてのテーブルを知っているとは限らないため(他の多くのバンドルには、この製品を参照しているエンティティを含めることができます)、ループして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)
Edit2:
最初に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;
その後、dbスキーマも更新する必要がありました。