परिभाषा . द्वारा आप कुंजी को शून्य पर सेट किए बिना उस रिकॉर्ड को हटा नहीं सकते जिसे विदेशी कुंजी इंगित कर रही है (onDelete="SET NULL"
) या डिलीट ऑपरेशन को कैस्केडिंग करना (दो विकल्प हैं
- ORM स्तर:cascade={"remove"}
| डेटाबेस स्तर:onDelete="CASCADE"
)
अभी भी मौजूदा रिकॉर्ड का डिफ़ॉल्ट मान सेट करना
, लेकिन आपको इसे मैन्युअल रूप से करना होगा, मुझे नहीं लगता कि सिद्धांत इस "आउट-ऑफ-द-बॉक्स" का समर्थन करता है (यदि मैं गलत हूं तो कृपया मुझे सुधारें, लेकिन इस मामले में डिफ़ॉल्ट मान सेट करना वैसे भी वांछित नहीं है)।पी>
यह सख्ती विदेशी कुंजी बाधाओं की अवधारणा को दर्शाती है; जैसे @ थियो ने कहा:
सॉफ्ट डिलीट (पहले ही उल्लेख किया गया) एक समाधान है, लेकिन आप एक अतिरिक्त 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
. के निर्माण के दौरान मूल्य , तो आपको हटाने पर जीवन चक्र कॉलबैक निष्पादित करने की भी आवश्यकता नहीं है।