2010-03-13 3 views
5

У меня есть список упорядоченных предметов, упорядоченных в соответствии с полем int order. Я создаю галерею в CakePHP 1.2, у которой есть предыдущая и следующая кнопка, и они должны ссылаться на предыдущий и следующий элементы в соответствии с их порядком, а не в соответствии с их id.CakePHP: найти соседей, заказать по 'названию' или 'заказать'

Чтобы получить этот результат, я включил параметр «порядок» в функцию поиска и заполнил его '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 в "fields"

И, наконец, ваше решение не оптимально, вы делаете два SQL-запроса, когда вам это не нужно. и «поле» не является параметром запроса, насколько я знаю, что на самом деле означает, что вы возвращаете все поля в таблице.

+0

Вы спасатель! – Bagata

0

У меня были проблемы с этим. В основном у меня есть список вопросов, которые необходимо упорядочить по порядку (только один раз) на сеанс пользователя.

Я устанавливал порядок модели что-то вроде этого:

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

Это работало отлично для обычных запросов, но найти соседей в тупике линии 2897 в модели.PHP:

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

Таким образом, чтобы вокруг него, я сделал следующее:

  • Добавить виртуальное поле под названием 'examination_order', и установить порядок в том, что:

    $this->TestQuestion->virtualFields['examination_order'] = 'FIELD(TestQuestion.id, 3, 1, 5)'; 
    
    $this->TestQuestion->order = array(
        $this->TestQuestion->alias . '.examination_order' 
    ); 
    
  • В поле поиска соседей установите «поле» в «exam_order» со значением, установленным в индекс, как было найдено ранее:

    $neighbors = $this->TestQuestion->find(
        'neighbors', 
        array(
         'field' => 'examination_order', 
         'value' => $testQuestion[$this->TestQuestion->alias]['examination_order'], 
         'conditions' => $conditions 
        ) 
    );