首页 > 解决方案 > CakePHP 4 修改表中的查询结果

问题描述

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

我看到的所有示例主要是针对控制器的。我有点在寻找类似于旧函数 afterFind() 的东西。

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

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

PS:我尝试过毫无用处地弄乱方案、行为和集合。(除非我使用不正确)

标签: phpdatabasecakephp

解决方案


这实际上取决于您需要修改结果的确切程度,“将单个 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;
        });
    });
}

也可以看看


推荐阅读