CakePHP 4 修改查询结果 TABLE
CakePHP 4 Modifying Query Results IN TABLE
我正在寻找有关每次调用特定 table 时如何修改查询结果的示例或说明。
我看到的所有示例主要针对控制器。我正在寻找类似于旧函数 afterFind() 的东西。
我的目标是在我的 Table 文件中放置一个函数,以在站点上全局自动修改结果。
[或者:=> 如果有人知道我可以自动将单个 json 列转换为多个列的方法,这可以解决我的问题。]
PS:我试过弄乱方案、行为和集合,但没有用。(除非我用错了)
这实际上取决于您需要如何精确地修改结果,“将单个 JSON 列转换为多个列”相当模糊,可以解释以各种不同的方式。
在实体中转换数据是一种选择,但请注意,实体应尽可能愚蠢,理想情况下,您应尽可能将它们保留为普通数据传输对象。如果有其他方法可以解决问题,通常应避免在实体本身中进行更大的“转换”操作。
修改结果的集中方法是查询对象的结果格式化程序,它们可以很容易地附加在 Model.beforeFind
event/handler 中,以便将它们应用于特定 [=] 的所有查询43=],甚至所有 tables。这几乎就是您在 CakePHP 2.x.
中使用 afterFind
所做的事情
结果格式化程序还有一个优点,即当您使用禁用水合作用的查询时,它们会为您提供正确的数据,即查询 return 数组而不是实体。
一个简单粗暴的例子:
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;
});
});
}
另见
我正在寻找有关每次调用特定 table 时如何修改查询结果的示例或说明。
我看到的所有示例主要针对控制器。我正在寻找类似于旧函数 afterFind() 的东西。
我的目标是在我的 Table 文件中放置一个函数,以在站点上全局自动修改结果。
[或者:=> 如果有人知道我可以自动将单个 json 列转换为多个列的方法,这可以解决我的问题。]
PS:我试过弄乱方案、行为和集合,但没有用。(除非我用错了)
这实际上取决于您需要如何精确地修改结果,“将单个 JSON 列转换为多个列”相当模糊,可以解释以各种不同的方式。
在实体中转换数据是一种选择,但请注意,实体应尽可能愚蠢,理想情况下,您应尽可能将它们保留为普通数据传输对象。如果有其他方法可以解决问题,通常应避免在实体本身中进行更大的“转换”操作。
修改结果的集中方法是查询对象的结果格式化程序,它们可以很容易地附加在 Model.beforeFind
event/handler 中,以便将它们应用于特定 [=] 的所有查询43=],甚至所有 tables。这几乎就是您在 CakePHP 2.x.
afterFind
所做的事情
结果格式化程序还有一个优点,即当您使用禁用水合作用的查询时,它们会为您提供正确的数据,即查询 return 数组而不是实体。
一个简单粗暴的例子:
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;
});
});
}
另见