定義 キーをnullに設定せずに外部キーが指しているレコードを削除することはできません(onDelete="SET NULL" )または削除操作をカスケードする(2つのオプションがあります
-ORMレベル:cascade={"remove"} |データベースレベル:onDelete="CASCADE" )。
既存のレコードのデフォルト値を設定する
、しかし手動で行う必要があります。Doctrineはこの「すぐに使える」サポートはないと思います(間違っている場合は訂正してください。ただし、この場合、デフォルト値を設定することは望ましくありません)。
この厳密さは、外部キー制約を持つという概念を反映しています。 @Théoが言ったように:
ソフト削除(すでに説明)は1つの解決策ですが、追加のremoved_page_idを追加することもできます。 page_idと同期する列 preRemoveで削除する直前 イベントハンドラー(ライフサイクルコールバック)。そのような情報に価値があるかどうか疑問に思いますが、あなたはそれをある程度利用していると思います。そうでなければ、この質問をしないでしょう。
私は間違いなくこれが良い習慣だとは主張していません 、しかし、それは少なくともエッジケースに使用できるものです。つまり、次のようなものです:
Revisionで :
/**
* @ORM\ManyToOne(targetEntity="Page", cascade="persist")
* @ORM\JoinColumn(name="page_id", referencedColumnName="id", onDelete="SET NULL")
*/
private $parentPage;
/**
* @var int
* @ORM\Column(type="integer", name="removed_page_id", nullable=true)
*/
protected $removedPageId;
次に、Pageで :
/**
* @ORM\PreRemove
*/
public function preRemovePageHandler(LifecycleEventArgs $args)
{
$entityManager = $args->getEntityManager();
$page = $args->getEntity();
$revisions = $page->getRevisions();
foreach($revisions as $revision){
$revision->setRemovedPageId($page->getId());
$entityManager->persist($revision);
}
$entityManager->flush();
}
または、もちろん、正しい$removedPageIdをすでに設定することもできます。 Revisionの作成中の値 、その後、削除時にライフサイクルコールバックを実行する必要はありません。