在我检查afterFind回调之前,如果find的结果为空。 由于在最新版本中删除了回调,因此可以从行为中检查该回调吗?
我不确定这是否是我需要的。我的用例是,我想知道查询是否没有结果。然后我会创建一个默认条目,因此它有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回调的另一个用例。
https://api.cakephp.org/3.4/class-Cake.ORM.ResultSet.html#_count
不知道你为什么不使用它并希望手动计算,但继续。
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;
});
});
在那里计算结果。
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);
查看上面的链接以获取详细说明,包括如何创建映射器和缩减器的示例。