2012-10-24 28 views
5

मैं तीन मॉडलों, उपयोगकर्ता, टिप्पणियां और पेज है।मैं केकपीएचपी में 'युक्त' प्रश्नों को कैसे कम कर सकता हूं?

उपयोगकर्ताकईटिप्पणियां, और टिप्पणियांकोपेज संबंधित है।

सभी मॉडल containable व्यवहार का उपयोग करते हैं, और डिफ़ॉल्ट रूप से recursive -1 पर उपयोग करते हैं।

अगर मैं पर टिप्पणियां एक find() क्वेरी फोन, साथ पृष्ठ मॉडल के क्षेत्र सहित अनुरोध होते हैं, यह सही ढंग से किसी एक क्वेरी का उपयोग कर परिणाम पूर्ण रूप से अपने उपयोगकर्ता के लिए पृष्ठ तालिका में शामिल होने देता है।

अगर मैं उपयोगकर्ता मॉडल से एक समान क्वेरी फोन (युक्तटिप्पणी और Comment.Page), परिणाम स्रोत को टिप्पणियां एक प्रश्न, टिप्पणी प्रति एक प्रश्न के बाद है स्रोत पृष्ठ स्रोत।

क्या जॉइन अनुकूलन को बनाए रखने के लिए मॉडल को कॉन्फ़िगर करने का कोई तरीका है? मुझे लगता है कि संबंधित मॉडल (टिप्पणियां) पर घोषित करने के लिए मेजबान मॉडल (उपयोगकर्ता) के माध्यम से अनुसरण किया जाएगा।

अद्यतन

मैं स्पष्ट करना चाहिए, मेरे सवाल का मेरे वास्तविक मामले का अध्ययन का एक सरलीकृत संस्करण का इस्तेमाल किया। हालांकि न्यूनतम समाधान मैं की आवश्यकता होती है इस प्रारंभिक मॉडल शामिल होंगेhasManyमॉडलbelongsToमॉडल संरचना, मैं भी श्रृंखला के नीचे एक या अधिक अतिरिक्त belongsToमॉडल पर समाधान के लिए देख रहा हूँ (जो हालांकि, मैं स्वचालित रूप से बाएं जॉइन का उपयोग करता हूं, क्योंकि यह संभव होगा)।

उत्तर

1

तो क्या आप पूछ रहे हैं कि क्या आपके सभी प्रश्नों को शामिल करने का कोई आसान तरीका है? यदि आप वर्तमान नियंत्रक के भीतर सब कुछ शामिल करना चाहते हैं। आप पहले Filter() कॉलबैक में शामिल कर सकते हैं और यह उस नियंत्रक के भीतर आपके सभी प्रश्नों पर लागू होगा।

+1

हाय कोल्बी। क्या आपको अभ्यास में इसका एक उदाहरण मिला है? जैसा कि मुझे लगता है कि यह दृष्टिकोण मेरी अपनी परियोजनाओं में से एक के साथ-साथ मूल पोस्टर की सहायता कर सकता है। –

+0

मुझे विश्वास है कि आपके नियंत्रक में ऐसा कुछ संपूर्ण नियंत्रक के लिए आपके प्रश्नों को शामिल करेगा। 'फ़ंक्शन से पहले फ़ंक्शन() \t { \t पैरेंट :: पहले फ़िल्टर(); \t \t $ यह-> मॉडल-> ('relatedModelStuff') शामिल है; \t \t \t} // पहले Filter' –

+0

धन्यवाद कोल्बी, यह काफी नहीं है जो मैं बाद में था, लेकिन पहले फ़िल्टर में घोषणा एक उपयोगी स्निपेट, चीयर्स है। – Rhys

1

मुझे पूरा यकीन नहीं है कि मैं आपका प्रश्न समझता हूं, लेकिन मुझे लगता है कि टिप्पणी -> पृष्ठ लिंकेज के लिए आपको कई एसक्यूएल-कॉल के साथ कोई समस्या है?यदि यह सही है, तो

  1. linkable behaviour जो एसक्यूएल कॉल कम कर देता है और लगभग काम करता है के रूप में शामिल करता है की कोशिश
  2. या अगर इसकी काफी एक ही डेटा आप चाहते हैं, तो एक समारोह में एक विशिष्ट मॉडल में आप कहीं भी हों से बनाने hte एसक्यूएल कॉल (उदाहरण के लिए टिप्पणी-मॉडल) के साथ खुश और द्वारा $this->Comment->myFindFct($params);

आशा व्यक्त की कि

संपादित में मदद करता है उपयोगकर्ता मॉडल से यह कहते हैं: एक बात यह है कि मेरे दिमाग में आता है। आप एसोसिएशन सरणी में inner में जॉइन प्रकार को बदलने में सक्षम थे, जिसने केक को एकल मॉडल को

2

हम्म को दिलचस्प बताया। यही कारण है कि अनुकूलन का एक प्रकार है कि कोर :)

किसी भी दर में लागू किया जाना चाहिए है, मुझे लगता है कि आप थोड़ा अलग तरह से क्वेरी का निर्माण करके एक ही परिणाम (शायद का प्रारूप अलग) हो सकता है:

$this->User->Comment->find('all', array(
    'conditions' => array(
    'Comment.user_id' => $userId 
), 
    'contain' => array(
    'User', 
    'Page' 
) 
)); 

टिप्पणी मॉडल से खोज करके, डेटा में शामिल होने के लिए इसे दो बाएं जुड़ने का उपयोग करना चाहिए क्योंकि वे दोनों 1: 1 संबंध हैं। नोट: जब आप उपयोगकर्ता मॉडल से खोजते हैं तो परिणाम सरणी थोड़ा अलग दिखाई दे सकती है।

+0

धन्यवाद जेरेमिहरिस। यह काम करेगा, लेकिन मुझे यह दिखाने के लिए ऊपर दिए गए मेरे प्रश्न को स्पष्ट करना होगा कि असली केस स्टडी के संबंध में कनेक्शन के अधिक स्तर की आवश्यकता होती है। मैं इसे एक संभावना के रूप में ध्यान में रखूंगा हालांकि अगर मुझे मैन्युअल रूप से मेरे प्रश्न बनाना है, तो यह थोड़ा सा समय बचाएगा। – Rhys

1

मुझे ऐसा करने का एक अच्छा तरीका है custom find method बनाना।

उदाहरण के लिए, मैं आपके उपयोगकर्ता मॉडल के अंदर एक विधि तैयार करूंगा जिसे _findUserComments() कहा जाता है। फिर आप इस विधि के अंदर सभी शामिल, शामिल, आदि करेंगे। फिर अपने नियंत्रकों, जहाँ भी आप अपने उपयोगकर्ता की टिप्पणियों के सभी प्राप्त करने की आवश्यकता में आप इसे thusly कहेंगे:

$this->User->find('UserComments', array(
    "conditions" => array(
     'User.id' => $userId 
    ) 
)); 

मुझे आशा है कि इस मदद करता है।

+0

धन्यवाद रॉब। मैं कस्टम खोज विधियों का व्यापक रूप से उपयोग करता हूं, वे उपयोगी होते हैं, लेकिन यह अभी भी समझने के लिए क्वेरी के बेहद मैन्युअल संस्करणों (जॉइन, इत्यादि) के निर्माण की स्थिति के आसपास नहीं होगा, जो मुझे समझने के लिए कोर द्वारा स्वचालित रूप से अनुकूलित किया जाएगा। – Rhys

1

bellow की तरह मॉडल परिभाषा हैं:

  1. टिप्पणी मॉडल पृष्ठ और उपयोगकर्ता के अंतर्गत आता है।
  2. पृष्ठ उपयोगकर्ता से संबंधित है और इसमें कई टिप्पणी हैं।
  3. उपयोगकर्ता कई पृष्ठ है और टिप्पणी

कोड bellow एक क्वेरी में शामिल हो गए वापस आ जाएगी:

$this->loadModel('Comment'); 
$this->Comment->Behaviors->attach('Containable'); 
$queryResult = $this->Comment->find('all', array(
    'contain' => array(
     'User', 
     'Page' 
    ) 
)); 

कोड bellow दो क्वेरी वापस आ जाएगी। पृष्ठ और उपयोगकर्ता किसी अन्य क्वेरी

$this->loadModel('Page'); 
$this->Page->Behaviors->attach('Containable'); 
$queryResult = $this->Page->find('all', array(
    'contain' => array(
     'User', 
    'Comment' 
    ) 
)); 

में एक क्वेरी और सभी टिप्पणी में शामिल हो गए और भी bellow कोड तीन क्वेरी, एक मॉडल के लिए एक वापस आ जाएगी:

$this->loadModel('User'); 
$this->User->Behaviors->attach('Containable'); 
$queryResult = $this->User->find('all', array(
    'contain' => array(
     'Page', 
     'Comment' 
    ) 
)); 
+0

धन्यवाद, हालांकि मेरी चिंता एक मॉडल संरचना के लिए है, जिसमें कई अलग-अलग मॉडल हैं जो एक मॉडल के बजाए श्रृंखला के नीचे कनेक्शन हैं। उदाहरण के लिए। एक प्रश्न पूछना जहां मॉडल 1 संबंधित मॉडल 2 से संबंधित है, मॉडल 2 मॉडल 3 से संबंधित है, और मॉडल 3 मॉडल 4 से संबंधित है। एक कस्टम कथन का उपयोग कर डेटा को एक ही प्रश्न में वापस किया जा सकता है लेकिन मेरी समझ यह है कि मूल को इस अनुकूलन को किसी भी तरह से संभालना चाहिए। – Rhys

+0

मुझे खेद है अगर मैं यहां आपका बयान समझ नहीं पा रहा हूं। लेकिन आपके प्रश्न पर "उपयोगकर्ताओं की कई टिप्पणियां हैं, और टिप्पणियां पृष्ठ से संबंधित हैं" उपरोक्त मेरी मॉडल परिभाषा के बराबर (बिंदु 3 और 1 देखें)। और क्वेरी परिणाम यदि आप उपयोगकर्ता मॉडल से कॉल करते हैं तो केवल तीन क्वेरी लौटाकर अनुकूलित किया गया है (प्रति पृष्ठ पृष्ठ पर बार-बार पूछताछ नहीं)। – Habibillah

+0

क्षमा करें, मुझे लगता है कि मेरे _update_ ने अधिक गहन केस स्टडी (जंजीर सामान के) को स्पष्ट किया जब मुझे एहसास हुआ कि मूल मामले के अध्ययन का समाधान वास्तव में मेरे प्रश्न के संदर्भ को कवर किए बिना हल किया जा सकता है – Rhys