Я знаю, как написать пользовательский поиск в 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()
для запроса?
Это возможно с использованием формуляров результатов, что и делает просмотрщик list
:
Разделенные на простые основы, вы просто объединяете поля клавиш и значений, которые обычно являются первичным ключом и полем отображения:
$query->formatResults(function(\Cake\Datasource\ResultSetInterface $results) {
return $results->combine('key_field', 'value_field');
});
Мне удалось сделать это с помощью пользовательского поиска:
// 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á'
];
Надеюсь, поможет.
Возможно, этот короткий код будет работать в вашем случае:
$query = $circlesTable->find('list')->find('listForDynamicViews');
Yo не нужно изменять свой пользовательский поиск вообще.
Table::findList()
, то есть использоватьQuery::formatResults()
? github.com/cakephp/cakephp/blob/...