Выполнение простой операции поиска в CakePHP

Используя CakePHP, мне нужно получить базовый список записей. Никаких объединений или специального форматирования результатов CakePHP, только базовый массив записей в следующем формате данных:

[
    {first_name: 'Matthew', last_name: 'Stafford', gender: 'male'},
    {first_name: 'Jason', last_name: 'Hanson', gender: 'male'}
]

Как проще всего это сделать с помощью Cake Models?


person Brad Koch    schedule 06.11.2011    source источник


Ответы (2)


При правильном разделении MVC вывод такого результата в формате JSON будет выглядеть примерно так:

Контроллер:

$people = $this->Person->find('all', array('conditions' => ...));
$this->set(compact('people'));

Вид:

echo json_encode(array_map(function ($p) { return $p['Person']; }, $people));
person deceze♦    schedule 06.11.2011
comment
На ваш взгляд, вы также можете использовать помощник JavaScript для создания результата json, выполнив команду echo $this->Js->object($results); - person Scott Harwell; 06.11.2011
comment
Извините, JSON не участвует в этом вопросе. Это только формат данных, который я хочу, чтобы метод модели возвращал. - person Brad Koch; 07.11.2011
comment
@Brad Тогда я не совсем понимаю, зачем тебе это. Я думаю, это только запутает ситуацию, если вы делаете извлечение результатов с ассоциациями и используете разные форматы в разных местах. Формат Cake по умолчанию многословен, но гибок и соответствует стандарту. - person deceze♦; 08.11.2011
comment
Причина в том, что приложение использует стандартную библиотеку AJAX с методом отправки, который автоматически кодирует любые данные, которые вы ему передаете. Программист на стороне клиента запрашивал данные в указанном формате. Справедливое замечание; мы обсудим возможность оставить ответ в формате пирога. - person Brad Koch; 08.11.2011
comment
@Brad Тогда я думаю, что мой ответ точен. Если это предназначено для связи с клиентом, вам нужно только отформатировать ответ в представлении. В самом Controller/Model/View вы можете/должны использовать стандартный формат Cake. - person deceze♦; 08.11.2011
comment
Мне нравится пытаться сделать свои представления немного тоньше при обработке данных, чем это, но вы правы, это логика представления, и строго MVC принадлежит представлению. - person Brad Koch; 08.11.2011

Мое текущее решение состоит в том, чтобы добавить следующий метод в AppModel:

function selectAll($options = array()) {
    $this->recursive = 0;
    $result = $this->find('all', $options);

    return Set::combine($result, "{n}.{$this->name}.{$this->primaryKey}", "{n}.{$this->name}");
}
person Brad Koch    schedule 07.11.2011
comment
По-прежнему открыт для менее навязчивых ответов, если у кого-то есть. - person Brad Koch; 07.11.2011