CakePHP 4修改表中的查询结果

CakePHP 4修改表中的查询结果,php,database,cakephp,Php,Database,Cakephp,我正在寻找一个示例或解释,说明如何在每次调用特定表时修改查询结果 我看到的所有示例主要是针对控制器的。我在寻找类似于旧函数afterFind()的东西 我的目标是在我的表文件中放置一个函数,以便在站点上全局自动修改结果 [或者:=>如果有人知道一种方法,我可以将一个json列自动转换为多个列,从而解决我的问题。] PS:我尝试过在毫无用处的情况下处理方案、行为和集合(除非我使用了一个错误的集合)这实际上取决于您需要修改结果的具体方式,“将一个JSON列转换为多个列”是相当模糊的,并且可以以各种不

我正在寻找一个示例或解释,说明如何在每次调用特定表时修改查询结果

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

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

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


PS:我尝试过在毫无用处的情况下处理方案、行为和集合(除非我使用了一个错误的集合)

这实际上取决于您需要修改结果的具体方式,“将一个JSON列转换为多个列”是相当模糊的,并且可以以各种不同的方式进行解释

转换实体中的数据是一种选择,但请注意实体应该尽可能愚蠢,理想情况下,您应该尽可能多地将它们保留为普通数据传输对象。如果有其他解决问题的方法,通常应该避免在实体本身中执行更大的“变革性”操作

修改结果的集中方法是查询对象的结果格式化程序,它们可以很容易地附加到
模型.beforeFind
事件/处理程序中,以便将它们应用于特定表的所有查询,甚至应用于所有表。这与CakePHP2.x中的
afterFind
差不多

结果格式化程序还有一个优点,即当您使用禁用水合作用的查询(即返回数组而不是实体的查询)时,它们将为您提供正确的数据

一个快速而肮脏的例子:

beforeFind(\Cake\Event\EventInterface$Event\Cake\ORM\Query$Query):\Cake\ORM\Query
{
返回$query->formatResults(函数(\Cake\Collection\CollectionInterface$results){
返回$results->map(函数($row){
//$row是结果集中的实体(禁用水合作用时为数组)
$row['new_field']=1234;
返回$row;
});
});
}
另见


从数据库中取出记录后,为什么不在PHP中洗牌?
修改查询
表示什么类型的修改?请共享“…自动修改结果…”正确的位置是实体类我只需要修改结果。从数据库收集数据时是否会执行实体函数?但我没有使用newEntity或patchEntity@你的问题质量不高。请改进它。给出一个你想要实现的具体例子,不要问一般的问题,提供更多的细节,展示你的查询和结构(你不需要透露你的确切结构,只需给出一个类似的例子)。否则,;这里到处都是雾。