سؤال

لنفترض أن لدي 3 نماذج:المستخدم، المنطقة، البلد.

User belongsTo Region
Region belongsTo Country

يستخدم كل من هذه النماذج السلوك القابل للاحتواء.أحاول العثور على مستخدمين من البلد الذي يحمل الرمز "US".إليك ما أحاول:

$users = $this->User->find('all', array(
    'conditions' => array('Country.code' => 'US'),
    'contain'    => array('Region.Country'),
));

يقوم CakePHP بتقسيم هذا إلى استعلامين:

  1. أولاً، يتم اختيار المعرفات لجميع الدول ذات الرمز "US".
  2. ثم يستخدم هذه المعرفات لتحديد جميع المستخدمين الذين ينضمون إلى المناطق التي region.country_id موجود في قائمة معرفات الدولة التي تم استردادها مسبقًا.

ونتيجة لذلك، انتهى بي الأمر بوجود أخطاء SQL في تطبيقي منذ أن قمت بتحميله conditions يحتوي المصفوفة على مرجع إلى Country.code، والاستعلام الثاني الذي ينشئه Cake لا ينضم إلى البلدان.

أفضل حل للكيك أراه هو إنشاء استعلام فرعي كما هو موضح في ملف شروط البحث المعقدة جزء من الدليل.ومع ذلك، يبدو هذا معقدًا للغاية، وهو بمثابة اختراق أكثر مما أرغب في تنفيذه.هل هناك طريقة أسهل أتجاهلها؟

هل كانت مفيدة؟

المحلول

كتب Nate Abele (المطور الرئيسي السابق لـ CakePHP) مقالًا حول القيام بذلك الانضمامات المخصصة والتي قد تساعد.

نصائح أخرى

ضع الشروط في الاحتواء أيضًا.على سبيل المثال:

$users = $this->User->find('all', array('contain' => array(
    'Region' => array(
        'Country' => array(
            'conditions' => array('Country.code' => 'US'),
        ),
    ),
)));

راجع المثال الثاني إلى الأخير في دليل الاحتواء

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top