Apiato框架使用l5-repository查询关联表不返回关联内容问题求助
问题根因
你目前只处理了数据库层的预加载逻辑,没有配置Transformer层的动态关联输出规则,导致关联数据已经被查询但没有被序列化返回。
修复步骤
- 补全Transformer动态包含配置
删除defaultIncludes后,必须将需要动态加载的关联添加到availableIncludes数组,同时编写对应的包含处理方法,示例如下:
// UsersTransformer.php protected $availableIncludes = ['subscription']; // 新增动态允许包含的关联 // 新增关联输出方法 public function includeSubscription(User $user) { if (empty($user->subscription)) { return $this->null(); } return $this->item($user->subscription, new SubscriptionTransformer); }
- 同步请求参数适配两层逻辑
andersao/l5-repository的预加载读取with参数,而Fractal(Apiato默认使用的序列化组件)的动态包含默认读取include参数,你之前仅注入了with参数,需要补充include参数注入:
// GetAllUsersRequest.php public function prepareForValidation() { $includeRelations = 'subscription'; // 数据库预加载参数 request()->request->add(['with' => $includeRelations]); request()->query->add(['with' => $includeRelations]); // Transformer序列化参数 request()->request->add(['include' => $includeRelations]); request()->query->add(['include' => $includeRelations]); }
- 验证请求逻辑
如果是手动触发Transformer序列化,需要确保启用了动态包含解析,Apiato默认的响应逻辑已内置该处理,自定义返回逻辑需要补充以下代码:
$transformer->parseIncludes(request()->get('include'));
验证方案
修改完成后直接请求v1/users,或者手动传参v1/users?with=subscription&include=subscription即可同时触发预加载和关联输出,彻底解决N+1问题同时实现动态关联返回。
内容的提问来源于stack exchange,提问作者user17426459
相关产品推荐
相关产品推荐

