Menurut definisi Anda tidak dapat menghapus catatan yang ditunjuk oleh kunci asing tanpa menyetel kunci ke nol (onDelete="SET NULL"
) atau mengalirkan operasi penghapusan (Ada dua opsi
- Tingkat ORM:cascade={"remove"}
| tingkat basis data:onDelete="CASCADE"
).
Ada alternatif dari menyetel nilai default dari catatan yang masih ada
, tetapi Anda harus melakukannya secara manual, saya tidak berpikir Doctrine mendukung "out-of-the-box" ini (tolong perbaiki saya jika saya salah, tetapi dalam hal ini pengaturan nilai default tidak diinginkan).
Ketegasan ini mencerminkan konsep memiliki batasan kunci asing; seperti yang dikatakan @Theo:
Hapus lunak (sudah disebutkan) adalah salah satu solusi, tetapi yang juga dapat Anda lakukan adalah menambahkan removed_page_id
tambahan kolom yang Anda sinkronkan dengan page_id
tepat sebelum Anda menghapusnya di preRemove
pengendali acara (panggilan balik siklus hidup). Apakah informasi tersebut memiliki nilai, saya ingin tahu, tetapi saya rasa Anda memiliki manfaat untuk itu, jika tidak, Anda tidak akan menanyakan pertanyaan ini.
Saya pasti tidak mengklaim ini adalah praktik yang baik , tetapi setidaknya itu adalah sesuatu yang dapat Anda gunakan untuk kasus tepi Anda. Jadi sesuatu di baris:
Dalam Revision
. Anda :
/**
* @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;
Dan kemudian di 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();
}
Atau Anda tentu saja sudah dapat mengatur $removedPageId
yang benar nilai selama konstruksi Revision
. Anda , maka Anda bahkan tidak perlu menjalankan panggilan balik siklus hidup saat penghapusan.