आप जिस रिश्ते के बाद हैं, उसे लेकर आपको बहुत सावधान रहना चाहिए। इनमें से कुछ उत्तरों पर एक त्वरित नज़र से, वे सुझाव देते हैं कि आप बस अपने व्यक्ति मॉडल में ईमेल मॉडल में शामिल हों और यह सुनिश्चित करने के लिए अपनी खोज की शर्तों पर भरोसा करें कि आपकी क्वेरी आपके सर्वर की मेमोरी को तोड़ नहीं देती है।
मैं यह मानने जा रहा हूं कि सबसे पहले, आप चाहते हैं कि यह ईमेल संबंध व्यक्ति पर आपके सभी प्रश्नों में निहित हो, अन्यथा आप बस निर्दिष्ट कर सकते थे प्रत्येक क्वेरी पर शामिल हों जिसके लिए आप इसे चाहते थे। इस मामले में, आप निश्चित रूप से मॉडल संबंध ।
आपका कोड दिखाता है कि शूटिंग और शूटिंग प्लेसमेंट (मान लें कि यह मॉडल मैपिंग संबंध के लिए एक मॉडल है) दोनों दो मॉडल से संबंधित हैं। संयोग से, शूटिंग belongsTo
उत्सर्जन - जो हमने अभी तक यहाँ नहीं देखा है। मुझे लगता है कि यह वर्तमान परिदृश्य पर लागू नहीं होता है।
अब, मान लें कि आपकी ईमेल तालिका में विदेशी कुंजियां हैं , यह एक hasOne
होगा hasMany
. के बजाय संबंध - इसलिए आपको इसे लिंक करने की आवश्यकता है। मैं इसे शूटिंग प्लेसमेंट मॉडल से जोड़ने जा रहा हूं क्योंकि यह वह मॉडल है जिसे आप क्वेरी कर रहे हैं, इसलिए यह केंद्रीय बिंदु होना चाहिए जिस पर मॉडल इसके चारों ओर जुड़ते हैं। संरचना के अनुसार, क्योंकि ऐसा लगता है कि सब कुछ आपके व्यक्ति मॉडल से उत्पन्न हुआ है, मुझे आपको कि query के बारे में पूछने का सुझाव देना होगा इसके बजाय मॉडल। लेकिन जिस तरह से इसे अभी तक सेट किया गया है, वह आपको लगभग कहीं से भी क्वेरी करने की अनुमति देगा और फिर भी कुछ मॉडल नामों और तालिका उपनामों को छोड़कर अधिकतर समान परिणाम पुनर्प्राप्त करेगा।
पूरी तरह से क्योंकि ईमेल और शूटिंग प्लेसमेंट के बीच आपकी विदेशी कुंजी का एक अलग नाम है, और केकेपीएचपी 1.3 इसे बहुत अच्छी तरह से संभाल नहीं पाता है, मैं यह भी सुझाव देने जा रहा हूं कि आप एक विदेशी कुंजी का उपयोग न करें, इसके बजाय इसे रिश्ते में डाल दें <मजबूत>शर्तें ।
class ShootingPlacement extends AppModel
{
var $name = 'ShootingPlacement';
var $actsAs = array('Containable');
var $hasOne = array(
'Email' => array(
'className' => 'Email',
'foreignKey' => false,
'conditions' => array(
'Email.shooting_placement_id = ShootingPlacement.id',
'Email.person_id = ShootingPlacement.person_id'
)
)
);
var $belongsTo = array (
'Person' => array (
'className' => 'Person',
'foreignKey' => 'person_id',
'order' => 'lastname ASC'
),
'Shooting' => array (
'className' => 'Shooting',
'foreignKey' => 'shooting_id'
)
);
}
मैंने वहां सम्मिलित व्यवहार भी जोड़ा है। यह आपको प्रत्येक क्वेरी से नियंत्रित करने की अनुमति देता है कि आप अपने प्राथमिक मॉडल परिणामों के साथ कौन से संबद्ध मॉडल वापस करना चाहते हैं। यह सभी के लिए डिफ़ॉल्ट होगा, लेकिन तब आसान हो सकता है जब आप केवल कुछ विशिष्ट और/या स्मृति कारणों से चाहते हैं (इस प्रकार के प्रश्न आपकी सर्वर मेमोरी को बहुत तेज़ी से नष्ट कर सकते हैं यदि आप उन्हें सीमित नहीं करते हैं या केवल फ़ील्ड नाम निर्दिष्ट करते हैं जिन्हें आप चाहते हैं वापसी)।
अब जब आप अपना ईमेल मॉडल बनाते हैं, तो मैं इसे फिर से शूटिंग प्लेसमेंट से जोड़कर उलझे हुए मॉडल की इस गड़बड़ी को और अधिक जटिल बनाने का सुझाव नहीं दूंगा। जैसा कि आपने कहा है, इसमें व्यक्ति मॉडल की एक विदेशी कुंजी भी है। तो हो सकता है कि आप अपने व्यक्ति मॉडल के लिए ऊपर जैसा ही काम करना चाहें (पाठ्यक्रम की व्यक्ति विदेशी कुंजी को प्रतिबिंबित करने के लिए शर्तों को बदलना)। इस तरह आपका मॉडल थोड़ा अधिक लचीला है; यह अभी भी ShootingPlacement में शामिल होगा और व्यक्ति, और यदि आवश्यक हो तो अन्य संबद्ध मॉडलों के बिना आपको इसे अलग से पूछने की अनुमति भी देगा।