نتائج استعلام طلب CakePhP على أكثر من مستوى واحد

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

  •  21-09-2019
  •  | 
  •  

سؤال

أنا أستخدم السلوك القابل للاحتفال للحصول على قائمة بالتعليقات (تنتمي إلى Post ، والتي تنتمي إلى السؤال ؛ سؤال Hasmany Post ، و Post Hasmany تعليقات ؛ كل هذه تنتمي إلى المستخدمين).

$data = $this->Question->find ( 'first', 
    array ('contain' => 
        array ('User', 
               'Post' => array ('User', /* 'order' => 'User.created DESC'*/ )
        ) 
    ) 
);

إنه يعمل ، عندما أعلق القسم في التعليقات أعلاه. أفترض أن هذا أمر متوقع ، لكن ما أريده هو أن يتم فرز جميع المنشورات التي تم العثور عليها ، حسب ترتيب الحقل "الذي تم إنشاؤه" من "المستخدم" الذي ينتمون إليه. كيف يمكنني إنجاز هذا الفرز أعمق في CakePhP؟ أحصل دائمًا على ، "تحذير (512): خطأ SQL: 1054: عمود غير معروف" user.created "في" شرط الطلب "" "

شكرا لمساعدتك!

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

المحلول

أيضًا ، قد تحاول تجميعها على جدول ذي صلة من مكالمة العثور التي لا تستخدم صلات.

اضبط مستوى التصحيح على شيء أكبر من 1 حتى تتمكن من رؤية سجل الاستعلام والتأكد من أن الكعكة لا تقوم بإجراء استفسارين لجلب بياناتك. إذا كان هذا هو الحال ، فإن الاستعلام الأول لا يشير فعليًا إلى الجدول الثاني.

إذا كنت ترغب في إجبار الانضمام يدويًا إلى هذه المواقف ، فيمكنك استخدام طريقة AD-Hoc Toins التي حددها Nate في الرابط التالي.

http://bakery.cakephp.org/articles/view/quick-tip-doing-ad-hoc-joins-in-model-find

نصائح أخرى

لقد وجدت طريقتان للتغلب على هذا. الأول هو تحديد Associacion المستوى الثاني مباشرة في النموذج. الآن سيكون لديك حق الوصول إلى هذه البيانات في كل مكان. يجب أن تبدو مثل هذا .....

var $belongsTo = array(
'Foo' => array(
  'className' => 'Foo', //unique name of 1st level join ( Model Name )
  'foreignKey' => 'foo_id', //key to use for join
  'conditions' => '',
  'fields' => '',
  'order' => ''
),
'Bar' => array(
  'className' => 'Bar', //name of 2nd level join ( Model Name )
  'foreignKey' => false,
  'conditions' => array(
    'Bar.id = Foo.bar_id' //id of 2nd lvl table = associated column in 1st level join
  ),
  'fields' => '',
  'order' => ''
)
);

المشكلة في هذه الطريقة هي أنها يمكن أن تجعل الاستعلامات العامة أكثر تعقيدًا مما تحتاج. وبالتالي ، يمكنك أيضًا إضافة استعلامات المستوى الثاني مباشرةً إلى عبارة FIND أو صفحات TE على النحو التالي: (ملاحظة: لقد وجدت أنه لسبب ما لا يمكنك استخدام جمعيات $ elemssto في المستوى الثاني ، وستحتاج إلى إعادة تعريفها إذا كانوا تم تعريفها بالفعل. على سبيل المثال ، إذا تم تعريف "foo" بالفعل في $ elemSto ، فأنت بحاجة إلى إنشاء "Foo1" مكررة لجعل الارتباط يعمل ، مثل المثال أدناه.)

$options['joins'] = array(

array('table' => 'foos',
  'alias' => 'Foo1',
  'type' => 'inner',
  'conditions' => array(
    'CurrentModel.foo_id = Foo1.id'
  )
),
array('table' => 'bars',
  'alias' => 'Bar',
  'type' => 'inner',
  'foreignKey' => false,
  'conditions' => array(
    'Bar.id = Foo1.bar_id'
  )
)
);

$options['conditions'] = array('Bar.column' => "value");
$this->paginate = $options;
$[modelname] = $this->paginate();
$this->set(compact('[modelname]'));

آمل أن يكون هذا واضحًا بما يكفي لفهمه وأنه يساعد شخصًا ما.

تحقق من القيمة العودية الخاصة بك. إذا كانت محدودة للغاية ، فسيتجاهل الروابط التي يمكن احتواءها ، IIRC. أتذكر أن تصطدم بهذا عدة مرات. سأحاول احتواء نماذج متعددة ، لكن بلدي recursive تم تعيين الخيار على 0 ولن يتم سحب شيء. لمثالك ، أعتقد أن قيمة 1 (الافتراضي) يكفي ، لكن ربما تقوم بتعيينه بشكل صريح 0 مكان ما؟

يمكنك إضافة قبل مكالمتك للعثور على () ما يلي:

 $this->Question->order = 'Question.created DESC';

نعم ، لم أستطع معرفة كيفية الفرز بناءً على النموذج ذي الصلة/المرتبطة ، لذلك انتهى به الأمر باستخدام Set::sort() طريقة. الدفع هذه المقالة للحصول على شرح جيد.

// This finds all FAQ articles sorted by:
// Category.sortorder, then Category.id, then Faq.displaying_order
$faqs = $this->Faq->find('all', array('order' => 'displaying_order'));
$faqs = Set::sort($faqs, '{n}.Category.id', 'ASC');
$faqs = Set::sort($faqs, '{n}.Category.sortorder', 'ASC');

... ونعم ، ربما يجب أن يكون Category->find() لكن لسوء الحظ ، لم يرمز المطور الأصلي إلى هذا الطريق ، ولم أكن أريد إعادة صياغة وجهات النظر.

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