Использование DISTINCT в функции поиска CakePHP - PullRequest
13 голосов
/ 12 ноября 2009

Я пишу приложение CakePHP 1.2. У меня есть список людей, которых я хочу, чтобы пользователь мог фильтровать по разным полям. Для каждого фильтруемого поля у меня есть выпадающий список. Выберите комбинацию фильтров, нажмите «Фильтр», и на странице отобразятся только соответствующие записи.

В people_controller у меня есть этот бит кода:

$first_names = $this->Person->find('list', array(
    'fields'=>'first_name',
    'order'=>'Person.first_name ASC',
    'conditions'=> array('Person.status'=>'1')
));
$this->set('first_names', $first_names);

(Status = 1, потому что я использую мягкое удаление.)

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

Копаясь в Поваренной книге, я нашел пример использования ключевого слова DISTINCT и изменил свой код, чтобы использовать его.

$first_names = $this->Person->find('list', array(
    'fields'=>'DISTINCT first_name',
    'order'=>'Person.first_name ASC',
    'conditions'=> array('Person.status'=>'1')
));

Это дает мне ошибку SQL, подобную этой:

Query: SELECT `Person`.`id`, DISTINCT `Person`.` first_name` FROM `people` AS `Person`   WHERE `Person`.`status` = 1   ORDER BY `Person`.`first_name` ASC

Проблема очевидна. Фреймворк добавляет Person.id к запросу. Я подозреваю, что это происходит от использования «списка».

Я буду использовать выбранный фильтр для создания оператора SQL при нажатии кнопки фильтра. Мне не нужно поле is, но я не могу от него избавиться.

Спасибо, Фрэнк Люк

Ответы [ 12 ]

1 голос
/ 04 июля 2015

В версии 2.7-RC это работает

$this->Model1->find('list', array(
      'fields' => array('Model1.field1', Model1.field1')
));
1 голос
/ 03 декабря 2013

Просто сгруппируйте по полям, которые вы хотите различить .. или используйте Set::extract() и затем array_unique()

...