2011-08-04 6 views
5

मैं अपने डॉक्टर 2 इकाइयों में कुछ अतिरिक्त फ़ंक्शंस शामिल करना चाहता हूं जिसमें कोड शामिल है जिसे मुझे अक्सर चलाना होगा। उदाहरण के लिए:क्या मैं एक सिद्धांत 2 इकाई विधि में एक सुविधा क्वेरी शामिल कर सकता हूं?

उपयोगकर्ता - कई पोस्ट
पोस्ट है - एक एकल उपयोगकर्ता

मैं पहले से ही एक समारोह $user->getPosts() है है, लेकिन यह मेरी सभी पोस्ट देता है।

$user->getPosts()->where('active = true') //if this were possible
या:: मैं एक $user->getActivePosts() है, जो जैसा होगा लिखने के लिए देख रहा हूँ
$em->getRepository('Posts')->findBy(array('user'=>$user,'active'=>true)) //if this were more convenient

जहां तक ​​मेरा बता सकते हैं, वहाँ इकाई प्रबंधक हालांकि एंटिटी को वापस पाने के लिए कोई रास्ता नहीं है ही है, तो मेरे ही विकल्प होगा

class User { 
    function getActivePosts() { 
    $all_posts = $this->getPosts(); 
    $active_posts = new ArrayCollection(); 
    foreach ($all_posts as $post) { 
     if ($post->getActive()) { 
      $active_posts->add($post); 
     } 
    } 
    return $active_posts; 
} 

बहरहाल, यह मुझे मेरे इकाई प्रबंधक में सभी पोस्ट लोड करने की आवश्यकता है, जब मैं वास्तव में उनमें से केवल एक छोटे सबसेट चाहते हैं, और यह मुझे आवश्यकता है PHP में छानने करना है, जब यह एम होगा एसक्यूएल परत में ऐसा करने के लिए बहुत अधिक उपयुक्त है। क्या मैं इकाई के अंदर जो करना चाहता हूं उसे पूरा करने का कोई तरीका है, या क्या मुझे इसके बाहर कोड बनाना है?

उत्तर

5

मुझे लगता है कि आपको इकाई मॉडल के बजाय PostRepository पर विधि को कार्यान्वित करना चाहिए।

मैं "डोमेन विशिष्ट" विधियों के पीछे भंडारों में सभी मॉडल संबंधित तर्क रखने की कोशिश करता हूं। इस तरह यदि आप इस तरह से बदलते हैं कि आप एक प्रतिनिधि सक्रिय हैं या नहीं, तो आपको केवल अपने आवेदन में चारों ओर बिखरे हुए सभी active = true कथनों को ढूंढने या "असंबद्ध" में परिवर्तन करने के बजाय केवल एक विधि के कार्यान्वयन को बदलना होगा। इकाई मॉडल

कुछ इस

PostRepository extends EntityRepository { 
    public function findActiveByUser($user){ 
    // whatever it takes to get the active posts 
    } 
} 
+1

सही तरह। जब भी आप एक इकाई के अंदर एक इकाई प्रबंधक डालने के इच्छुक होते हैं, तो आप जानते हैं कि यह एक कदम वापस लेने का समय है और आप जो कुछ भी कर रहे हैं, उसके बारे में सोचें या किसी प्रकार के भंडार के बारे में सोचें। ओपी के मामले में, अगर वह सिर्फ पोस्ट संग्रह को फ़िल्टर करना चाहता है, तो वह एंटीटी में इसे $ - से अधिक लूपिंग करके और एक सरणी को पॉप्युलेट करके कर सकता है - अच्छा और साफ, लेकिन बहुत प्रभावी नहीं है क्योंकि इसे लोडिंग/हाइड्रेटिंग की आवश्यकता होती है सभी उपयोगकर्ता की पोस्ट। – timdev

+0

क्या पोस्ट पोस्टपॉजिटरी :: findActiveByUser() को अपने स्वयं के findActivePosts() विधि में कॉल करने के लिए पोस्ट एंटिटी के लिए यह बुरा अभ्यास माना जाता है? –