CakePHP 4 如何重写Table类的find方法以获取指定格式的返回结果
绝对不要修改vendor目录下的核心文件,这类修改会在后续依赖更新时被覆盖,完全不具备可维护性。
你需要的格式可以通过CakePHP 4自带的查询结果格式化器功能实现,不需要完全重写Table类的find方法,两种实现方案如下:
方案1:仅特定查询返回目标格式(推荐)
如果你只需要部分查询返回该格式,使用自定义查找器即可,在你的AdminTable.php文件中添加如下方法:
// App\Model\Table\AdminTable.php public function findWithEntityWrapper(Query $query, array $options): Query { return $query->formatResults(function (\Cake\Collection\CollectionInterface $results) { return $results->map(function ($adminEntity) { // 按需求将实体封装到指定键的数组中 return [ 'Admin' => $adminEntity ]; }); }); }
调用方式:
// 查询时指定自定义查找器 $adminList = $this->Admin->find('withEntityWrapper')->all()->toArray();
此时$adminList就是你需要的目标结构。
方案2:全局所有Admin表查询默认返回目标格式
如果你需要所有对Admin表的查询都默认返回该格式,可以直接在AdminTable类中重写父类的find方法:
// App\Model\Table\AdminTable.php public function find($type = 'all', $options = []): Query { // 先调用父类原生find方法生成基础查询对象 $query = parent::find($type, $options); // 全局挂载结果格式化逻辑 $query->formatResults(function (\Cake\Collection\CollectionInterface $results) { return $results->map(fn($adminEntity) => ['Admin' => $adminEntity]); }); return $query; }
重写后所有$this->Admin->find()的查询结果转数组后都会自动匹配你需要的格式。
内容的提问来源于stack exchange,提问作者Shashank
相关产品推荐
相关产品推荐

