Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Nonaktifkan batasan kunci asing Doktrin

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mencoba mendapatkan properti non-objek - CodeIgniter

  2. Bagaimana cara menghubungkan kembali koneksi yang hilang dengan EclipseLink?

  3. Highcharts grafik multi-garis

  4. Sintaks MySQL UPDATE dengan beberapa tabel menggunakan klausa WHERE

  5. Memposting data Formulir ke MySQL menggunakan nodejs w/ Express