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;
        });
    });
}

另见