CakePHP3删除afterFind后,在哪里检查查询结果是否为空?

时间:2017-07-04 11:00:22

标签: cakephp orm query-builder cakephp-3.x

在我检查afterFind回调之前,如果find的结果为空。 由于在最新版本中删除了回调,因此可以从行为中检查该回调吗?

我不确定这是否是我需要的。我的用例是,我想知道查询是否没有结果。然后我会创建一个默认条目,因此它有1个结果。

1 个答案:

答案 0 :(得分:2)

https://book.cakephp.org/3.0/en/appendices/orm-migration.html#no-afterfind-event-or-virtual-fields

  

定义后,您可以使用$ user-> full_name访问新属性。通过使用ORM的Map / Reduce功能修改结果,您可以从结果中构建聚合数据,这是经常使用afterFind回调的另一个用例。

在ResultSet对象上调用count()

https://api.cakephp.org/3.4/class-Cake.ORM.ResultSet.html#_count

不知道你为什么不使用它并希望手动计算,但继续。

使用resultFormatter()

https://book.cakephp.org/3.0/en/orm/query-builder.html#adding-calculated-fields

您的行为必须将beforeFind()中的格式化程序添加到查询中。您可以添加添加它的自定义查找。示例代码(取自文档):

$query->formatResults(function (\Cake\Collection\CollectionInterface $results) {
    return $results->map(function ($row) {
        $row['age'] = $row['birth_date']->diff(new \DateTime)->y;
        return $row;
    });
});

在那里计算结果。

使用map / reduce

https://book.cakephp.org/3.0/en/orm/retrieving-data-and-resultsets.html#map-reduce

  

通常,查找操作需要对数据库中的数据进行后处理。虽然实体的getter方法可以处理大多数虚拟属性生成或特殊数据格式化,但有时您需要以更基本的方式更改数据结构。

您的行为必须将beforeFind()中的mapper / reducer添加到查询中。您可以添加添加它的自定义查找。示例代码(取自文档):

$articlesByStatus = $articles->find()
    ->where(['author_id' => 1])
    ->mapReduce($mapper, $reducer);

查看上面的链接以获取详细说明,包括如何创建映射器和缩减器的示例。