cascade = {“kaldır”} VS orphanRemoval = true VS ondelete = "CASCADE


95

Bir ana varlık silindiğinde otomatik olarak alt varlığı silmenin aşağıdaki yolu hakkında birkaç bilgi toplamaya çalıştım. Görünüşe göre en yaygın yol bu üç ek açıklamadan birini kullanmak: cascade = {"remove"} OR orphanRemoval = true OR ondelete = "CASCADE" .

Ben : Üçüncü biri hakkında biraz şaşırtmak ondelete = "cascade" bu çok azdır ilgili doktrini resmi belgelerinde açıklama olarak,) ve birisi eğer çok isterim şu bilgileri onaylamak ben toplayıp benim araştırma anlama net ve deneyim ...

BU NE YAPAR

cascade = {"remove"}
==> ters taraftaki varlık, sahibi olan taraf olduğu zaman silinir. Sahip olunan diğer tarafla çok sayıda olsanız bile.
- koleksiyonda kullanılmalıdır (yani OneToMany veya ManyToMany ilişkisinde)
- ORM'de uygulama

orphanRemoval = true
==> ters taraftaki varlık, sahip taraftaki varlık olduğunda VE artık başka bir sahip taraf varlığa bağlı olmadığında silinir. (ref. doctrine official_doc -
ORM'de uygulama - OneToOne, OnetoMany veya ManyToMany ile kullanılabilir

onDelete = "CASCADE"
==> bu, veritabanındaki yabancı anahtar sütununa Silme Sırasında Basamaklama ekleyecektir
- Bu stratejiyi doğru yapmak biraz zor ama çok güçlü ve hızlı olabilir. (ref. doctrine official_doc ... ancak daha fazla açıklama okumamıştır)
- ORM daha az iş yapmak zorundadır (önceki iki yöntemle karşılaştırıldığında) ve bu nedenle daha iyi performansa sahip olmalıdır.

diğer bilgiler
- tüm bu 3 yöntem çift yönlü ilişki varlıkları üzerinde uygulanır ( sağ mı ??? )
- cascade = {"remove"} kullanmak, onDelete = CASCADE herhangi bir yabancı anahtarı tamamen baypas eder. (ref. doctrine_official_doc )

KOD İÇİNDE NASIL KULLANILACAĞI ÖRNEĞİ

  • orphanRemoval ve cascade = {"remove"} ters çevrilmiş varlık sınıfında tanımlanmıştır.
  • ondelete = "CASCADE", sahip varlıkta tanımlanmıştır
  • Ayrıca @ORM \ JoinColumn (onDelete = "CASCADE") yazabilir ve doktrinin sütun adlarını işlemesine izin verebilirsiniz

cascade = {"kaldır"}

/**
* @OneToMany(targetEntity="Phonenumber", mappedBy="contact", cascade={"remove"})
*/
protected $Phonenumbers

orphanRemoval = true

/**
* @OneToMany(targetEntity="Phonenumber", mappedBy="contact", orphanRemoval=true)
*/
protected $Phonenumbers

onDelete = "KADEMELİ"

/** 
* @ManyToOne(targetEntity="Contact", inversedBy="phonenumbers")
* @JoinColumn(name="contact_id", referencedColumnName="contact_id", onDelete="CASCADE")
*/ 
protected $contact; 

Yanıtlar:


63

onDelete="CASCADE"veritabanının kendisi tarafından yönetilir. cascade={"remove"}doktrin ile yönetilir.

onDelete="CASCADE"işlemler doktrin yerine veritabanı düzeyinde gerçekleştirildiği için daha hızlıdır. Kaldırma, Doctrine tarafından değil veritabanı sunucusu tarafından gerçekleştirilir. cascade={"remove"}Doktrin ile varlığın kendisini yönetmesi gerekir ve başka sahip varlıklara sahip olup olmadığını görmek için ekstra kontroller gerçekleştirir. Başkası yoksa, varlığı silecektir. Ancak bu, ek yük yaratır.


cascade = {"kaldır"}

  • ters taraftaki varlık, sahip taraftaki varlık olduğu zaman silinir. Sahip olunan diğer tarafla çok sayıda olsanız bile. Hayır, varlık başka bir şeye aitse. Silinmeyecek.
  • koleksiyonda kullanılmalıdır (yani OneToMany veya ManyToMany ilişkisinde)
  • ORM'de uygulama

orphanRemoval = "true"

  • ters taraftaki varlık, sahip taraf varlık olduğunda VE artık başka bir sahip taraf varlığa bağlı olmadığında silinir. Tam olarak değil, bu doktrinin başka bir varlığa ait değilmiş gibi davranmasını sağlar ve böylece onu ortadan kaldırır.
  • ORM'de uygulama
  • OneToOne, OnetoMany veya ManyToMany ile kullanılabilir

onDelete = "KADEMELİ"

  • bu, VERİ TABANINDAKİ yabancı anahtar sütununa Silme Sırasında Basamak'ı ekleyecektir
  • Bu stratejiyi düzeltmek biraz zor ama çok güçlü ve hızlı olabilir. (bu doktrin resmi öğreticisinden bir alıntıdır ... ama daha fazla açıklama görmedim)
  • ORM daha az iş yapmalı (önceki iki yöntemle karşılaştırıldığında) ve bu nedenle daha iyi performansa sahip olmalıdır.

4
@ waaghals. Cascade'deki yorumlarınız hakkında = {"remove"} ==> Varlık Makalesi ve Kategori arasında ManyToMany ilişkim var. Bir Makaleyi kaldırdığımda ($ em-> remove ($ article);), bu kategoriler başka makalelerle de bağlantılıysa BİLE bu makaleye bağlı tüm kategorileri kaldırıyor. bu yüzden yazdığınız gibi davranmadığını söyleyebilirim.
Alexis_D

2
@ waaghals. OrphanRemoval = "true" hakkındaki yorumlarınız hakkında "Ters taraftaki varlık, sahibi olan taraf olduğu zaman silinir ve başka herhangi bir kuruluşa ait değilse" doktrin resmi sayfalarından alıntılanmıştır. doktrin = öksüz kalma .
Alexis_D

2
@Alexis_D, tam cevap yanlış ve gerçekten yeni başlayanlar için kafa karıştırıcı olabilir yorumlarınızla birlikte kararlaştırılan
Stepan Yudin

3
Okuduğum daha net örneklerden biri: gist.github.com/pylebecq/f844d1f6860241d8b025
Victor S

@VictorS'ın bağlantısı çok açık. Artık Doctrine ile çalışmıyorum, bu yüzden cevabımı ilk elden nasıl çalıştığını bilmeden güncelleyemeyeceğimi hissediyorum. Birisi cevabımı güncelleyebilirse bu harika olur.
Waaghals
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.