كيف يمكنني الانضمام إلى جدولين في الثالث ن..ن (hasAndBelongsToMany) العلاقة في للكيك?
-
02-07-2019 - |
سؤال
لدي 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
الأسلوب.
نصائح أخرى
هنا هو بلدي تلميح:حاول الحصول على الاستعلام الخاص بك مكتوب في العادية 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()