CakePHP: найти соседей, заказать по «имени» или «заказ» - PullRequest
5 голосов
/ 13 марта 2010

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

Чтобы получить этот результат, я включил параметр 'order' в функцию find и наполнил его '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.

Ответы [ 2 ]

4 голосов
/ 20 июля 2011

Да, проблема в том, что вы не включили поле заказа в массив полей.

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

Если у вас нет связанных моделей с конфликтующими именами полей, вам не нужно включать префикс модели Item. (хотя я обычно так делаю, чтобы избежать таких ошибок.) Ваш оригинальный синтаксис будет работать, если вы включите [Item.]order в "полях"

Наконец, ваше решение не оптимально, вы делаете два SQL-запроса, когда вам это не нужно. и насколько мне известно, 'field' не является опцией запроса, что фактически означает, что вы возвращаете все поля в таблице.

0 голосов
/ 18 ноября 2013

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

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

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

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

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

Итак, чтобы обойти это, я сделал следующее:

  • Добавьте виртуальное поле с именем 'exam_order' и установите следующий порядок:

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

    $neighbors = $this->TestQuestion->find(
        'neighbors',
        array(
            'field' => 'examination_order',
            'value' => $testQuestion[$this->TestQuestion->alias]['examination_order'],
            'conditions' => $conditions
        )
    );
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...