2013-10-23 7 views
7

मैं एक सिम्फनी 2 प्रोजेक्ट बना रहा हूं और नरम हटाने को लागू करने के लिए gedmo/doctrine-extensions (GitHub) का उपयोग कर रहा हूं। मेरा सवाल यह है कि क्या सॉफ्टडिलीट को "अक्षम" या "ओवरराइड" करने का कोई तरीका है या यहां तक ​​कि यह पता लगाया गया है कि कुछ नरम हटा दिया गया है या नहीं।सिम्फनी 2/सिद्धांत: गेडमो के सिद्धांत एक्सटेंशन का उपयोग करते समय "हटाए गए" डेटा को पढ़ना

मैं एक "नोट" इकाई एक "उपयोगकर्ता" इकाई का संदर्भ देता है है:

यहाँ की स्थिति है। एक विशिष्ट नोट उस उपयोगकर्ता को संदर्भित करता है जिसे नरम हटा दिया गया है। भले ही उपयोगकर्ता को हटा दिया गया हो, फिर भी यह TWIG के "परिभाषित" तर्क के लिए सच हो जाता है और हटाए गए उपयोगकर्ता की आईडी भी वापस कर सकता है। हालांकि, अगर मैं किसी अन्य जानकारी के लिए पूछता हूं (जिसमें "हटाए गए" पैरामीटर शामिल हैं जो यह इंगित करता है कि इसे हटा दिया गया है या नहीं) मुझे 500 "इकाई नहीं मिली" त्रुटि मिलती है।

चूंकि डेटा वास्तव में अभी भी वहां है, और चूंकि नोट स्वयं को हटा नहीं दिया गया है, इसलिए भी मैं यह कहना चाहूंगा कि नोट किसने लिखा है, भले ही उपयोगकर्ता हटा दिया गया हो।

क्या यह संभव है? यदि नहीं, तो मैं कैसे ठीक से पता लगा सकता हूं कि कुछ नरम हटा दिया गया है या नहीं? जैसे मैंने कहा, $note->getUser() अभी भी किसी ऑब्जेक्ट को पुनर्प्राप्त करता है और किसी भी शून्य/"परिभाषित" तुलना के लिए सत्य लौटाता है।

+0

यह Doctrine2 की ज्ञात सीमा है, https://github.com/doctrine/doctrine2/issues/4543 देख – PowerKiKi

उत्तर

6

आप eager के संबंध लोड हो रहा है निर्धारित करने की आवश्यकता है, इस के साथ सिर्फ एक id और कुछ नहीं वस्तुओं की आलसी लोड हो रहा है नहीं कर पाएगा।

आप उत्सुक लोड हो रहा है के बारे में अधिक जानकारी पा सकते हैं और इसे यहाँ एनोटेशन है:

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/working-with-objects.html#by-eager-loading

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/annotations-reference.html

मेरे कोड का सवाल है, यह है कि यह कैसे जब एक User अब के लिए एक लिंक को परिभाषित करने की तरह लग रहा है:

/** 
* @ORM\ManyToOne(targetEntity="User", inversedBy="answers", fetch="EAGER") 
* @ORM\JoinColumn(name="user_id", referencedColumnName="id") 
*/ 
private $user; 

इस मामले में, User इकाई कई answers हो सकता है। जब answer के नजरिए से एक User लोड हो रहा है, इस काम करेगा:

foreach($answers as $answer) { 
    $user = $answer->getUser(); 

    if (!$user) { 
     continue; 
    } 
} 
+0

दस्तावेज़ीकरण के लिए 'उत्सुक लोडिंग' लिंक काम नहीं करता –

+0

धन्यवाद, इसे ठीक किया गया :) – Oli

1

आप अस्थायी रूप से सॉफ्ट-डिलीट अक्षम कर सकते हैं ताकि हटाए गए आइटम आपके परिणामों में लौटा दिए जाएंगे। See the documentation, आप के लिए विशेष रूप से दिलचस्प अनुभाग है कि पढ़ता है:

यह SoftDeleteable फिल्टर को निष्क्रिय कर देगा तो संस्थाओं जो "सॉफ़्ट नष्ट कर दिया" परिणामों में दिखाई देगा $ em-> getFilters() थे -> अक्षम ('नरम deleteable');

तो, पहले कोड के ऊपर अपनी इकाई प्रबंधक $em पर चलने और फिर अपने $note इकट्ठा करने के लिए इसका इस्तेमाल करते हैं।

+0

समस्या यह है कि मैं डॉन पैरेंट इकाइयों (यानी नोट्स) नहीं चाहते हैं जिन्हें मुलायम हटा दिया गया है। फ़िल्टर को अक्षम करने से हटाए गए नोट भी वापस आ जाएंगे जिन्हें मैं नहीं चाहता हूं। –

14

आप ऐसा कर सकते हैं:

$filter = $em->getFilters()->enable('soft-deleteable'); 
$filter->disableForEntity('Entity\User'); 
$filter->enableForEntity('Entity\Note'); 
+3

यह 'सॉफ्ट-डिलीट करने योग्य' के बजाय ** 'softdeleteable' ** हो सकता है ... (मैं स्टॉफ सिद्धांत एक्सटेंशन का उपयोग कर रहा हूं) – eDoV

संबंधित मुद्दे