自定义查找器,当我在cakephp 3中执行toArray时返回列表

时间:2015-02-03 15:26:50

标签: php cakephp cakephp-3.0

我知道如何通过查看this在CakePHP 3.x中编写自定义查找程序。

我也知道如何获得一个"列表"使用find('list')然后通过this

使用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()进行查询,如何编写自定义查找程序?

3 个答案:

答案 0 :(得分: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');
});

答案 1 :(得分:1)

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

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

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

答案 2 :(得分: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á'
];

希望它有所帮助。