使用staudenmeir/eloquent-json-relations时hasManyJson查询无结果
关联查询返回0的问题修复
问题根因
- Product模型反向关联方法名错误:当前定义的关联方法名为
products,和Category模型的正向关联方法重名,会导致关联关系解析冲突,无法正确匹配关联逻辑,反向关联对应分类,方法名应为categories。 - JSON关联路径配置错误:配置的外键路径
category_ids[]->id属于语法错误,Staudenmeir\EloquentJsonRelations扩展识别JSON数组下的对象键时,不需要手动添加[]标记数组层级,多余的标记会导致路径匹配失败,无法查询到关联数据。 - 遍历计数逻辑可优化:直接遍历count关联属性会触发N+1查询,性能差,且如果关联未正确解析会直接返回0。
修正后代码
Category模型
class Category extends Model { use \Staudenmeir\EloquentJsonRelations\HasJsonRelationships; public function products() { // 修正JSON路径,移除多余的[]标记 return $this->hasManyJson(Product::class, 'category_ids->id'); } }
Product模型
class Product extends Model { use \Staudenmeir\EloquentJsonRelations\HasJsonRelationships; protected $casts = [ 'category_ids' => 'json', ]; // 修正方法名为categories,匹配分类关联语义,同时修正JSON路径 public function categories() { return $this->belongsToJson(Category::class, 'category_ids->id'); } }
控制器方法
推荐使用withCount预统计关联数量,避免N+1查询,性能更高:
public function two_category() { $list = Category::where('home_status', true) ->withCount('products') ->get(); foreach($list as $ls){ echo $ls->name.' '.$ls->products_count.'<br>'; } dd('ended'); }
补充说明:如果你的
category_ids字段存储的是纯ID数组(格式如[1,2,3],不是对象数组),只需要把上述关联配置里的外键路径改为category_ids即可。
内容的提问来源于stack exchange,提问作者pyrogrammer
相关产品推荐
相关产品推荐

