في CakePhP ، كيف يمكنني تعيين شروط لنموذج غير مرتبط بالنموذج الذي أقوم بتراكمه ولكنه يرتبط بذور ما هو؟
-
25-09-2019 - |
سؤال
أنا أرجل ($ this-> customer-> paginate ()) على نموذج "العميل".
يرتبط نموذج العميل بنموذج "الاتصال" والذي بدوره يرتبط بنموذج "ContactAddress".
لذا:
اتصال العميل hasmany
الاتصال ينتمي إلى ContactAddress
الآن أريد أن أتعامل مع العملاء في "العملاء-> index ()" باستخدام استعلام بحث دعنا نقول "contactaddress.city" مثل "٪ new ٪"
كيف أقوم بهذا العمل؟ عندما أفعل ذلك في شروط التربط ، يقول: "عمود غير معروف" ContactAddress.city "في" الفقرة "" منطقيا.
المحلول 2
لقد وجدت حلًا مرضيًا للغاية.
لقد بحثت من خلال الكود المعقد لوظيفة ترقيم الصفحات ، ووجدت ، منطقياً ، أن تراجعه يضع الشروط ويمررها إلى دالة العثور على النموذج (ما لم يكن النموذج لديه وظيفة "تراجع").
حاولت أولاً تجاوز وظيفة التراجع ، لكن هذا كان معقدًا للغاية. الحل الذي وجدته في النهاية هو تمرير صلات إلى خيارات الولادة تمامًا مثلما تمر بها عند القيام بـ "البحث" على نموذج:
//Set the pagination options:
`$this->paginate = array(
'limit' => 25,
'order' => array(
'Customer.lastname1' => 'asc'
),
'joins' =>
array(
// OUTER JOIN because I wanted to also
// fetch record that do not have a 'contact'
array(
'table' => 'contacts',
'alias' => 'Contact',
'type' => 'LEFT OUTER',
'conditions' => array(
'Customer.id = Contact.customer_id',
'Contact.class' => 'ContactAddress'
)
),
array(
'table' => 'contact_addresses',
'alias' => 'ContactAddress',
'type' => 'LEFT OUTER',
'conditions' => array(
'Contact.index = ContactAddress.id',
)
),
),
// In your conditions you can now use any table that
// was joined as well as the original 'customer' table.
'conditions' => $conditions,
);
$this->set('customers',$this->paginate('Customer'));
في كلتا الحالتين آمل أن يساعد هذا شخص ما!
نصائح أخرى
من الصعب على أي حالة أو كعكة أو لا. تحتاج إما إلى القيام بذلك في خطوات (تجد ContactAddresses
ومرتبط Contact.customer_ids
أولا ، ثم تراجع على Customer.id IN ($customer_ids)
) أو تحتاج إلى القيام بذلك مع الفائزين الفرعيين. انظر دليل حول كيفية القيام بفرع بشكل صحيح (إنها ليست جميلة).
ما هو أفضل يعتمد على مهارات الترميز الخاصة بك وحجم قاعدة البيانات وتعقيد الاستعلام الناتج. اختبر كلاهما وحدد ما يناسبك.