كيف يمكنني الانضمام إلى جدولين في الثالث ن..ن (hasAndBelongsToMany) العلاقة في للكيك?

StackOverflow https://stackoverflow.com/questions/112730

سؤال

لدي n...n هيكل اثنين من الجداول ، makes و models.حتى الآن لا توجد مشكلة.

في الجدول الثالث (products) مثل:

id
make_id
model_id
...

مشكلتي هي إنشاء طريقة عرض المنتجات من واحد المواصفات make داخل بلدي ProductsController تحتوي فقط على تلك النماذج:

أعتقد أن هذا يمكن أن تعمل:

var $uses = array('Make', 'Model');

$this->Make->id = 5; // My Make

$this->Make->find(); // Returns only the make I want with it's Models (HABTM)
$this->Model->find('list'); // Returns ALL models
$this->Make->Model->find('list'); // Returns ALL models

لذلك, إذا كنت ترغب في استخدام list لتمرير وجهة نظري لإنشاء أزرار الراديو يجب أن تفعل foreach() في بلدي make مجموعة للعثور على جميع نماذج عناوين إنشاء مجموعة جديدة وإرسالها إلى عرض عن طريق $this->set().

$makeArray = $this->Make->find();
foreach ($makeArray['Model'] as $model) {
    $modelList[] = $model['title'];
}
$this->set('models', $models)

هل هناك أي طريقة أسهل للحصول على تلك القائمة دون تشدد على make الصفيف.سيكون الشائعة المهمة إلى تطور مثل هذه السيناريوهات في التطبيق(ق).

شكرا مقدما على أي تلميح!

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

المحلول 5

الحل لا يمكن أن يتحقق مع استخدام with العملية في habtm مجموعة على النموذج.

باستخدام with يمكنك تحديد "الأوسط" الجدول مثل:

$habtm = " ...
  'with' => 'MakeModel',
   ... ";

و داخليا ، في نموذج أو وحدة تحكم ، يمكنك مسألة ظروف find الأسلوب.

انظر: http://www.cricava.com/blogs/index.php?blog=6&title=modelizing_habtm_join_tables_in_cakephp_&more=1&c=1&tb=1&pb=1

نصائح أخرى

هنا هو بلدي تلميح:حاول الحصول على الاستعلام الخاص بك مكتوب في العادية SQL قبل محاولة لإعادة استخدام الكعكة المكتبة.في جوهر كنت تفعل الكثير من العمل الإضافي الذي ديسيبل يمكن أن نفعله لك.النهج الخاص بك (للعرض فقط - ليست جيدة SQL):

SELECT * FROM makes, models, products WHERE make_id = 5

أنت لا تأخذ بعين الاعتبار العلاقات (إلا إذا كعكة سحرية لصناعة السيارات يفهم علاقات الجداول)

ربما كنت تبحث عن شيء أن ينضم إلى هذه الأشياء معا:

SELECT models.title FROM models 
INNER JOIN products 
  ON products.model_id = models.model_id 
  AND products.make_id = 5

نأمل أن هذا هو دفعة في الاتجاه الصحيح ؟

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

  • ذات الصلة نموذج B عودة جميع معرفات من المرشحين المحتملين لنموذج A ، ثم القيام الثاني الاستعلام عن نموذج A.I. e.:

    $this->ModelB->find('first', array('conditions' => array('field' => $condition)));
    array(
        ['ModelB'] => array( ... ),
        ['ModelA'] => array(
            [0] => array(
                'id' => 1
            )
    )
    

    الآن لديك مجموعة من جميع معرفات ModelA التي تنتمي إلى ModelB يطابق الشروط التي يمكنك بسهولة استخراج باستخدام مجموعة::استخراج().أساسا ما يعادل SELECT model_a.id FROM model_b JOIN model_a WHERE model_b.field = xxx.القادمة كنت تبحث عن ModelA:

     $this->ModelA->find('all', array('conditions' => array('id' => $model_a_ids)));
    

    التي سوف تنتج SELECT model_a.* FROM model_a WHERE id IN (1, 2, 3), الذي هو وسيلة ملتوية من القيام الانضمام إلى البيان.إذا كنت في حاجة على أكثر من نموذج ذات الصلة ، كرر حتى كل معرفات ModelA SQL استخدام تقاطع جميع معرفات (WHERE id IN (1, 2, 3) AND id IN (3, 4, 5)).

  • إذا كنت بحاجة فقط شرط واحد على ModelB ولكن ترغب في استرداد ModelA, البحث فقط عن ModelB.كعكة تلقائيا استرداد ذات الصلة ModelAs لك (انظر أعلاه).قد تحتاج إلى تعيين::استخراج() لهم مرة أخرى ، ولكن هذا قد يكون كافيا.

  • يمكنك استخدام الأسلوب أعلاه والجمع بين ذلك مع قابلة للاحتواء السلوك للحصول على المزيد من التحكم في النتائج.

  • إذا فشل كل شيء آخر أو الأساليب المذكورة أعلاه ببساطة تنتج الكثير من النفقات العامة ، لا يزال بإمكانك الكتابة الخاصة بك الخام SQL مع $this->Model->query().إذا كنت عصا كعكة SQL المعايير (تسمية الجداول بشكل صحيح مع FROM model_as AS ModelA) الكعكة لا تزال في مرحلة ما بعد العملية النتائج الخاصة بك بشكل صحيح.

نأمل أن يكون هذا يرسل لكم في الاتجاه الصحيح.

كل ما تبذلونه مختلفة تجعل->find() و نموذج->find() المكالمات مستقلة تماما عن بعضها البعض.حتى جعل->نموذج>find() هو نفس نموذج->find(), كعكة لا تذكر أو تأخذ في الاعتبار ما كنت قد وجدت بالفعل في نماذج أخرى.ما تبحث عنه هو شيء من هذا القبيل:

$this->Product->find('all', array('conditions' => array('make_id' => 5)));

تحقق من تعيين::استخراج() طريقة الحصول على قائمة من نموذج العناوين من نتائج $this->جعل->find()

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