2010-03-13 12 views
5

मेरे पास ऑर्डर फ़ील्ड order के अनुसार आदेशित वस्तुओं की एक सूची है। मैं केकपीएचपी 1.2 में एक गैलरी बना रहा हूं जिसमें एक पिछला और अगला बटन है और उन्हें अपने ऑर्डरिंग के अनुसार पिछले और अगले आइटम से लिंक करना चाहिए, न कि उनके 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 मिलेगा।

उत्तर

4

हाँ समस्या यह थी कि आप अपने फ़ील्ड सरणी में ऑर्डर फ़ील्ड शामिल नहीं थे।

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

जब तक आप परस्पर विरोधी फ़ील्ड नाम के साथ मॉडल से संबंधित है आप Item. मॉडल उपसर्ग शामिल करने के लिए (हालांकि मैं आमतौर पर वैसे भी कर ऐसी त्रुटियों से बचने के लिए।) मूल वाक्य रचना काम करेगा की आवश्यकता नहीं है तुम अगर आप को शामिल किया था [Item.]order "फ़ील्ड"

अंत में, आपका समाधान इष्टतम नहीं है, जब आपको आवश्यकता नहीं है तो आप दो SQL क्वेरी बना रहे हैं। और 'फ़ील्ड' एक प्रश्न विकल्प नहीं है जहां तक ​​मुझे पता है कि वास्तव में इसका मतलब है कि आप तालिका में सभी फ़ील्ड लौट रहे हैं।

+0

आप एक lifesaver हैं! – Bagata

0

मुझे इसके साथ समस्याएं थीं। असल में मेरे पास ऐसे प्रश्नों की एक सूची है जिन्हें प्रति उपयोगकर्ता सत्र यादृच्छिक रूप से आदेश दिया जाना चाहिए (केवल एक बार)।

मैं कुछ इस तरह के मॉडल के आदेश की स्थापना की गई थी:

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

यह सामान्य प्रश्नों के लिए ठीक काम किया, लेकिन पड़ोसियों खोजने मॉडल में लाइन 2897 से stymied है।php:

  • कि करने के लिए 'examination_order' नामक एक आभासी क्षेत्र आदेश जोड़ें, और सेट:

    $this->TestQuestion->virtualFields['examination_order'] = 'FIELD(TestQuestion.id, 3, 1, 5)'; 
    
    $this->TestQuestion->order = array(
        $this->TestQuestion->alias . '.examination_order' 
    ); 
    
  • $query['order'] = $field . ' DESC'; 
    

    तो यह चारों ओर पाने के लिए, मैं निम्नलिखित किया

    पड़ोसियों को कॉल करने के लिए, 'फ़ील्ड' को 'exam_order' पर सेट करें, जैसा कि पहले पाया गया इंडेक्स पर मान सेट किया गया है:

    $neighbors = $this->TestQuestion->find(
        'neighbors', 
        array(
         'field' => 'examination_order', 
         'value' => $testQuestion[$this->TestQuestion->alias]['examination_order'], 
         'conditions' => $conditions 
        ) 
    ); 
    
संबंधित मुद्दे