如何在cakephp-3中创建自定义列表查找方法?

如何在cakephp-3中创建自定义列表查找方法?,cakephp,cakephp-3.0,Cakephp,Cakephp 3.0,在我的代码中,我使用自定义keyField和valueField重用列表查找操作,如下所示: ->find('list', [ 'keyField' => 'key', 'valueField' => 'value' ]) 我想定义一个自定义列表查找方法来设置keyField和valueField,这样我就不必重复自己的操作了。此外,它还应可与其他自定义查找方法链接。编辑:通过在自定义查找程序中调用findList,可获得简单明了的解决方案: public

在我的代码中,我使用自定义keyField和valueField重用列表查找操作,如下所示:

->find('list', [
     'keyField' => 'key',
     'valueField' => 'value'
])

我想定义一个自定义列表查找方法来设置keyField和valueField,这样我就不必重复自己的操作了。此外,它还应可与其他自定义查找方法链接。

编辑:通过在自定义查找程序中调用findList,可获得简单明了的解决方案:

public function findCustomList(Query $query, array $options)
{
     return $this->findList($query, [
         'keyField' => 'key',
         'valueField' => 'value',
     ]);
}
第一个答案:

public function findCustomList(Query $query, array $options)
{
     return $this->findList($query, [
         'keyField' => 'key',
         'valueField' => 'value',
     ]);
}
可以使用查询对象的formatResults方法注册格式化程序,将结果格式化为所需列表:

public function findCustomList(Query $query, array $options)
{
    $query->formatResults(function ($results) {
        /** @var \Cake\Collection\CollectionInterface $results */
        $formatedResults = [];
        foreach ($results as $key => $result) {
            $formatedResults[$result->key] = $result->value;
        }
        return new Collection($formatedResults);
    });

    return $query;
}

您还可以覆盖基本查找程序,即
Table::findList()
方法,并相应地更改/设置选项。如果您不想更改该表的所有
list
查找并使用自定义查找器,您可以在内部调用常规的list finder方法,而不是连接一个基本上也是这样做的自定义格式化程序。@ndm:是的,我想使用自定义查找器(我不想覆盖所有列表查找)。如果我在内部调用常规列表查找器,我会得到第二个查询对象吗?我已经有一个查询对象作为参数传递到函数中。我找到了一种在内部调用列表查找器的方法:
$this->findList($query,[])
,这样我就可以将$query对象传递到该调用中。因此,我不必处理第二个$query对象,这就是我所指的。所有查找程序使用一个查询对象,并且通常返回相同的查询对象。