2013-01-24 44 views
5

मेरे पास वर्तमान में एक इकाई है जिसे मैं लोड पर थोड़ा संशोधित करना चाहता हूं। यह संशोधन एक बार परिवर्तन होगा जो तब इकाई के साथ एक नए क्षेत्र में जारी रहेगा।एसोसिएशन के लिए सिद्धांत पोस्ट लोड ईवेंट

मेरे वर्तमान उद्देश्य को स्पष्ट करने के लिए: इकाई एक "स्थान" है और एक नेस्टेड सेट का हिस्सा बनती है। इसमें एक नाम, एलएफटी/आरजीटी मूल्य और एक आईडी है। एक कम्प्यूटेशनल रूप से महंगा कार्य जो मैं इस इकाई के साथ कर रहा था वह एक पूर्ण स्थान पथ लाने और इसे पाठ के रूप में प्रदर्शित करना था। उदाहरण के लिए, "वाटरलू" स्थान इकाई के साथ मैं "वाटरलू | लंदन | यूनाइटेड किंगडम" के रूप में प्रदर्शित करना चाहता हूं। इसमें पूरे सेट (रूट नोड में) के माध्यम से ट्रैवर्सिंग शामिल है।

इस की लागत को कम करने के लिए मैंने स्थान इकाई पर एक नया फ़ील्ड बनाया है जिसे इस मान के साथ मुद्रित किया जा सकता है (और जब स्थान (या पेड़ के भीतर कोई भी स्थान) नाम संशोधित किया गया है) के रूप में अपडेट किया गया है। मेरे आवेदन को ध्यान में रखते हुए एक लाइव स्टेटस में मुझे इसे एक ऑफ ऑफ प्रक्रिया के रूप में चलाने से बचने की ज़रूरत है क्योंकि इसे डीबी पर काफी गहन एक बार हिट करना होगा, इसके बजाय मैं इस अपडेट को तब लागू करना चाहता हूं जब प्रत्येक स्थान (बिना वह मान) लोड किया गया है। मुझे लगता है कि सिद्धांत प्राप्त करने के लिए डॉक्टर लोड पोस्ट इवेंट मैकेनिज्म सही होगा, हालांकि ..

स्थान इकाइयां सीधे मेरे आवेदन से लोड नहीं होती हैं, वे हमेशा एक रिश्ते के विपरीत पक्ष होंगे। इस मन, और तथ्य यह है कि सिद्धांत के postLoad घटना है:

  • लोड नहीं करता है किसी भी संबद्ध डेटा
  • केवल मालिक संस्थाओं

मैं कोई रास्ता नहीं है के लिए निकाल दिया है (करने के लिए उपयोग की अनुमति) इन संशोधनों को धीरे-धीरे बनाने के लिए।

किसी के पास कोई सलाह है, या इस पर अनुभव है?

+0

व्यक्तिगत सलाह के रूप में, मैं दृढ़ता परत में फैंसी तर्क के माध्यम से इसे संभाल नहीं पाऊंगा। इसके बजाए, एक समग्र मॉडल बनाएं जो प्रॉक्सी आपकी इकाई को कॉल करता है और अंततः मूल वस्तुओं को प्राप्त करता है। यह आपकी सेवा परत फिट होगा – Ocramius

उत्तर

5

मैं इकाई प्रबंधक पर प्रारंभिक ऑब्जेक्ट() विधि का उपयोग कर पोस्टलोड ईवेंट के भीतर संबंधित स्थान ऑब्जेक्ट्स लोड करने में सक्षम था।

/** 
* Upon loading the object, if the location text isn't set, set it 
* @param \Doctrine\ORM\Event\LifecycleEventArgs $args 
*/ 
public function postLoad(\Doctrine\ORM\Event\LifecycleEventArgs $args) 
{ 
    $this->em = $args->getEntityManager(); 
    $entity = $args->getEntity(); 

    if ($entity instanceof \Entities\Location) 
    { 
     if (is_null($entity->getPathText())) 
     { 
      $entity->setPathText("new value"); 
      $this->em->flush($entity); 
     } 
    } elseif ($entity instanceof {parent Entity}) 
    { 
     $location = $entity->getLocation(); 
     // This triggers the postLoad event again, but this time with Location as the parent Entity 
     $this->em->initializeObject($location); 
    } 
} 

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

  • कोई संबंधित समस्या नहीं^_^