CakePhp: Найдите соседей, заказ на «имя» или «заказ»
-
19-09-2019 - |
Вопрос
У меня есть список заказанных предметов, заказанных в соответствии с полем Int order
Анкет Я создаю галерею в CakePhp 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
.
Решение
Да, проблема заключалась в том, что вы не включали поле заказа в массиве своих полей.
$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 в модели.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' );
В звонке «Найти соседи» установите «поле» на «exament_order» со значением, установленным на индекс, как было обнаружено ранее:
$neighbors = $this->TestQuestion->find( 'neighbors', array( 'field' => 'examination_order', 'value' => $testQuestion[$this->TestQuestion->alias]['examination_order'], 'conditions' => $conditions ) );