سؤال

لدي قائمة بالعناصر المطلوبة، أمرت وفقا للحقل الدولي orderوبعد أقوم بإنشاء معرض في CakePhp 1.2 الذي يحتوي على زر Prev and Next وتلك التي يجب أن تصل إلى العنصر السابق والموقع وفقا لأمرهم، وليس وفقا ل id.

من أجل الحصول على هذه النتيجة، قمت بتضمين المعلمة "الترتيب" إلى وظيفة البحث، وتسجيلها 'Item.order'=>'DESC'. وبعد لا يزال النتيجة هي id قائمة طلب.

سؤالي هو: ماذا أفعل الخطأ؟ جهاز التحكم الخاص بي:

$this->Item->id = 16;

$neighbours = $this->Item->find('neighbors', array(
    'order' => array('Item.order'=>'DESC'),
    'fields' => array('id','name')
));

بلدي الحل

لقد جربت نهجا مختلفا. الرمز الخاص بي الآن يفعل الوظيفة ويبدو كما يلي:

$order = $this->Item->findById(6);

$neighbours = $this->Item->find('neighbors', array(
    'field' => 'order',
    'value' => $order['Item']['order']
));

عن طريق تحديد المعلمة 'field' إلى الحقل سيكون حقل الطلب، وتعيين 'value' المعلمة إلى قيمة الطلب لك البند الحالي الذي ستحصل عليه prev و next.

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

المحلول

نعم كانت المشكلة هي أنك لم تضم حقل الطلب في صفيف الحقول الخاصة بك.

$neighbours = $this->Item->find('neighbors', array(
    'order' => 'order DESC',
    'fields' => array('id', 'name', 'order')
));

ما لم تكن لديك نماذج ذات صلة بأسماء ميدانية متضاربة، فأنت لا تحتاج إلى تضمين Item. بادئة نموذج (على الرغم من أنني عادة ما أفعل على أي حال لتجنب مثل هذه الأخطاء.) أنت بناء الجملة الأصلي سوف تعمل إذا كنت قد أدرجت [Item.]order في المجالات"

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

نصائح أخرى

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

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

'FIELD(TestQuestion.id, 3, 1, 5)';

عمل هذا على ما يرام للاستعلامات العادية، لكن العثور على الجيران ينبع من الخط 2897 في model.php:

$query['order'] = $field . ' DESC';

لذلك للحصول عليه، فعلت ما يلي:

  • أضف حقل افتراضي يسمى "ExamAction_order"، وقم بتعيين الطلب على ذلك:

    $this->TestQuestion->virtualFields['examination_order'] = 'FIELD(TestQuestion.id, 3, 1, 5)';
    
    $this->TestQuestion->order = array(
        $this->TestQuestion->alias . '.examination_order'
    );
    
  • في استدعاء الجيران البحث، اضبط "الحقل" إلى "الفحص"، مع تعيين القيمة إلى الفهرس كما هو موجود سابقا:

    $neighbors = $this->TestQuestion->find(
        'neighbors',
        array(
            'field' => 'examination_order',
            'value' => $testQuestion[$this->TestQuestion->alias]['examination_order'],
            'conditions' => $conditions
        )
    );
    
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top