php - CakePHP 4 修改表中的查询结果
问题描述
我正在寻找有关每次调用特定表时如何修改查询结果的示例或说明。
我看到的所有示例主要是针对控制器的。我有点在寻找类似于旧函数 afterFind() 的东西。
我的目标是在我的表格文件中放置一个函数,以自动在站点上全局修改结果。
[或:=> 如果有人知道我可以将单个 json 列自动转换为多个列,这可以解决我的问题。]
PS:我尝试过毫无用处地弄乱方案、行为和集合。(除非我使用不正确)
解决方案
这实际上取决于您需要修改结果的确切程度,“将单个 JSON 列转换为多个列”相当模糊,并且可以以各种不同的方式进行解释。
转换实体中的数据是一种选择,但请注意实体应该尽可能愚蠢,理想情况下,您应该尽可能多地将它们保留为纯数据传输对象。如果有其他解决问题的方法,通常应该避免在实体本身中进行更大的“转换”操作。
修改结果的集中方法是查询对象的结果格式化程序,它们可以很容易地附加到Model.beforeFind
事件/处理程序中,以便将它们应用于特定表的所有查询,甚至应用于所有表。afterFind
这几乎就是您在 CakePHP 2.x中所做的。
结果格式化程序还有一个优点,即当您使用禁用水合的查询时,它们会为您提供正确的数据,即返回数组而不是实体的查询。
一个快速而肮脏的例子:
public function beforeFind(\Cake\Event\EventInterface $event, \Cake\ORM\Query $query): \Cake\ORM\Query
{
return $query->formatResults(function (\Cake\Collection\CollectionInterface $results) {
return $results->map(function ($row) {
// $row is the entity (or array when hydration is disabled) in the result set
$row['new_field'] = 1234;
return $row;
});
});
}
也可以看看
推荐阅读
- c++ - 为什么在这种情况下不调用我的移动构造函数?(首先分配 r 值引用并创建对象)
- php - 计算一行中不为空的列数
- c# - 如何在 LINQ 查询中的 .Select() 中获取新创建的对象
- javascript - 使用数组作为键来遍历 JavaScript 中的对象
- javascript - 为什么不将 JWT 存储在全局变量中?
- lodash - JS lodash uniq 没有使用 ObjectID 列表
- android - 数据库中的检测值问题
- html - 使用 *ngFor 生成带有 Angular 材质的列
- javascript - 离子原生文件:File.writeFile 不工作(文件未创建 + 没有回调响应)
- r - 将常用公式编写为 R 中的表达式