You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 23:39:37