Laravel API Resource如何从其他关联的City_User中间表获取pivot数据
问题原因
- 模型的
pivot属性默认指向当前调用上下文对应的多对多关联中间表:在City页面调用User Resource时,上下文是City和User的多对多关联,所以pivot指向city_user表;但在Suburb页面调用User Resource时,上下文是Suburb和User的多对多关联,pivot默认指向Suburb与User的中间表,自然无法获取city_user的字段。 - 第二种写法的错误在于仅判断了
city关联已加载,仍然访问默认上下文的$this->pivot,没有从city关联中提取对应中间表数据。
解决方法
首先在查询Suburb关联用户时,预加载用户对应的城市关联,并且限定为当前Suburb所属的城市(避免用户关联多个城市时取值错误):
// 控制器查询逻辑示例 $suburb = Suburb::with([ 'city', 'users' => function ($query) use ($suburbCityId) { // 预加载用户的city关联,仅查询当前Suburb所属的城市 $query->with(['city' => fn ($q) => $q->where('id', $suburbCityId)]); } ])->find($suburbId);
之后在User Resource中直接从预加载的city关联中提取pivot字段即可:
return [ // 原有返回的其他字段 'valid_from' => $this->when( $this->relationLoaded('city') && $this->city->isNotEmpty(), fn () => $this->city->first()->pivot?->valid_from ), ];
如果需要兼容多场景调用User Resource,也可以通过Resource附加参数传递当前上下文的城市ID,避免关联取值冲突:
// 控制器调用时传递附加参数 return UserResource::collection($users) ->additional(['current_city_id' => $suburb->city_id]); // Resource中取值逻辑 return [ 'valid_from' => $this->when( $this->relationLoaded('city') && isset($this->additional['current_city_id']), fn () => $this->city->firstWhere('id', $this->additional['current_city_id'])?->pivot?->valid_from ), ];
内容的提问来源于stack exchange,提问作者eggsloveoats
相关产品推荐
相关产品推荐

