定義 キーを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
の作成中の値 、その後、削除時にライフサイクルコールバックを実行する必要はありません。