CakePHP 4 修改表中的查询结果

我正在寻找有关如何在每次调用特定表时修改查询结果的示例或解释。

我见过的所有例子主要是针对控制器的。我正在寻找类似于旧函数 afterFind() 的东西。

我的目标是在我的表文件中放置一个函数,以自动修改站点上全局的结果。

[或者:=>如果有人知道我可以自动将单个 json 列转换为多个列的方法,这可以解决我的问题。]

PS:我尝试过弄乱方案、行为和集合,但没有用。(除非我错误地使用了一个)


慕斯709654
浏览 77回答 1
1回答

喵喵时光机

这实际上取决于您需要如何准确地修改结果,“将单个 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;        });    });}
打开App,查看更多内容
随时随地看视频慕课网APP