الاستعلام عن البيانات على أساس علاقة مستوى 3rd في للكيك

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

  •  06-07-2019
  •  | 
  •  

سؤال

ولقد أنشأت علاقات متابعة:

A HABTM B
B belongsTo C
C hasMany B

والآن، لA معين، أنا في حاجة إلى كل C مع تولي ال B. أستطيع أن أكتب الاستعلامات SQL، ولكن ما هي الطريقة للكيك المناسبة؟ ما طريقة القيام أدعو أي نموذج، والتي المعلمات؟

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

المحلول

وكنت أذهب مع الجواب عزيز وببساطة معالجة البيانات كما أنها تأتي في. إذا كنت بحاجة C ليكون النموذج الأولي الخاص بك على الرغم من سيكون لديك لتفعل القليل من الحل. كعكة ليست جيدة بشكل رائع مع الظروف على النماذج ذات الصلة، ولكن خاصة على أبناء عمومة 3RD إزالة نوع من الاستفسارات. وعادة ما يقتصر على الانضمام الفعلي الاستفسارات حول العلاقات belongsTo أو hasMany. ليس على العلاقات HABTM على الرغم من تلك التي يحصل في استعلامات منفصلة. وهذا يعني أنك لا يمكن أن تشمل الظروف على نماذج HABTM ذات الصلة.

وأفضل رهان ثم قد يكون شيئا من هذا القبيل:

// get related records as usual with the condition on A, limit to as little data as necessary
$ids = $this->A->find('first', array(
    'conditions' => array('A.id' => 'something'), 
    'recursive'  => 2,
    'fields'     => array('A.id'),
    'contain'    => array('B.id', 'B.c_id', 'B.C.id') // not quite sure if B.C.id works, maybe go with B.C instead
));

// find Cs, using the ids we got before as the condition
$Cs = $this->C->find('all', array(
    'conditions' => array('C.id' => Set::extract('/B/C/id', $ids)),
    'recursive   => 1
);

لاحظ أن هذا تنتج تماما حفنة من الاستفسارات، حتى انها ليست حقا الحل الأمثل. كتابة SQL الخاصة بك قد يكون في الواقع أنظف الطريق.

وتحرير:

وبدلا من ذلك، هل يمكن إعادة ربط الجمعيات الخاصة بك على ذبابة على لجعلها hasMany العلاقات / belongsTo، على الأرجح باستخدام الجدول / نموذج من ألف وباء وهذا قد تمكنك من استخدام الظروف على النماذج ذات الصلة أكثر سهولة الانضمام، لكنه ما زال صعبة لجلب خدمات العملاء عندما كان الشرط هو على A.

نصائح أخرى

$this->A->find(
   'first', 
   array('conditions'=>array('id'=>'someword'), 
   'recursive'=>2)
);

ومثل هذا؟

وهذا يمكن أن تعمل

$this->C->find('all',
array('conditions'=>array('id'=>'someword','B.aid'=>$a.id)));

وكنت أعتقد من السلوك "تحت السيطرة" ( http://book.cakephp.org / رأي / 474 / إحتواء) ... يعطي السيطرة كثيرا على إيجاد البيانات ذات الصلة.

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