在CakePHP3中执行toArray时返回列表的自定义查找器

在CakePHP3中执行toArray时返回列表的自定义查找器,php,cakephp,cakephp-3.0,Php,Cakephp,Cakephp 3.0,我知道如何在CakePHP3.x中编写自定义查找程序 我还知道如何使用find('list')获取“list”,然后使用toArrayvia 我想做的是编写一个自定义查找程序,确保我可以对自定义查找程序的结果使用toArray,如果我使用find('list'),则返回一个类似的数组 我的自定义查找器方法名是findListForDynamicViews 因此我想要 $query = $circlesTable->find('listForDynamicViews'); $data =

我知道如何在CakePHP3.x中编写自定义查找程序

我还知道如何使用
find('list')
获取“list”,然后使用
toArray
via

我想做的是编写一个自定义查找程序,确保我可以对自定义查找程序的结果使用
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()
进行查询,如何编写自定义查找程序?

这可以使用结果格式化程序,这也是
列表
查找程序所做的:

剥离到基本要素,您只需按键和值字段组合,它们通常是主键和显示字段:

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

也许这段简短的代码适用于您的情况:

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

您根本不需要修改您的自定义查找程序。

我用这样的自定义查找程序实现了这一点:

// 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á'
];

希望有帮助。

不确定我是否理解正确,也许您只是想做
Table::findList()
所做的事情,即使用
Query::formatResults()
?我的意思是,我需要在custom finder中做一些特殊的事情吗?就像我需要用一种特殊的方式设置select()一样?嘿,ndm,你说得对。你给了我我所需要的。你想写一个答案,这样我就可以接受它作为答案了吗?给其他慢/差的读者一个小提示:“return”是一个匿名函数,你仍然需要在finder的末尾返回查询对象。