Пользовательский искатель, который возвращает список, когда я делаю toArray в cakephp 3

0

Я знаю, как написать пользовательский поиск в CakePHP 3.x, посмотрев на это.

Я также знаю, как получить "список" с помощью find('list') а затем использовать toArray через это

Я хочу, чтобы написать пользовательский поиск, который будет гарантировать, что я могу использовать toArray в результате пользовательского поиска и вернуть аналогичный массив, если я использую find('list').

Мое имя метода поиска - findListForDynamicViews.

Поэтому я хочу

 $query = $circlesTable->find('listForDynamicViews');
 $data = $query->toArray(); // this gives me an associative array similar to the one we get from find('list')

Как написать пользовательский поиск, учитывая, что я знаю, как использовать where() для запроса?

  • 1
    Не уверен, правильно ли я вас понимаю, может быть, вы просто хотите сделать то, что делает Table::findList() , то есть использовать Query::formatResults() ? github.com/cakephp/cakephp/blob/...
  • 0
    Я имел в виду, нужно ли делать что-то особенное внутри пользовательского поиска? Как мне нужно установить select () специальным образом?
Показать ещё 1 комментарий
Теги:
cakephp
cakephp-3.0

3 ответа

1
Лучший ответ

Это возможно с использованием формуляров результатов, что и делает просмотрщик list:

https://github.com/cakephp/cakephp/blob/a64a62126287abbc3d8c53f48a5281ac77e791b0/src/ORM/Table.php#L897

Разделенные на простые основы, вы просто объединяете поля клавиш и значений, которые обычно являются первичным ключом и полем отображения:

$query->formatResults(function(\Cake\Datasource\ResultSetInterface $results) {
    return $results->combine('key_field', 'value_field');
});
0

Мне удалось сделать это с помощью пользовательского поиска:

// contained in my PropertiesTable.php
public function findCityList(Query $query) {
    return $query->find('list', ['keyField' => 'id', 'valueField' =>'city'])
                ->select(['city'])->distinct(['city']);
}

Вызов списка на find() уже возвращает массив, поэтому вам не нужно вызывать toArray() после него.

// the retuning array 
$citys = [
    '7' => 'Olímpia',
    '10' => 'São José do Rio Preto',
    '17' => 'Guarujá'
];

Надеюсь, поможет.

0

Возможно, этот короткий код будет работать в вашем случае:

$query = $circlesTable->find('list')->find('listForDynamicViews');

Yo не нужно изменять свой пользовательский поиск вообще.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню