Laravel:通过中间表数据限制多对多预加载
解决Laravel多对多预加载时通过中间表字段过滤关联模型的问题
单次预加载时过滤(仅本次查询生效)
你之前的写法出错是因为:预加载关联模型时,Laravel默认不会自动关联中间表,直接引用table_pivot.active会导致字段找不到。正确做法是用Laravel为多对多关联提供的wherePivot方法,它会自动处理中间表的关联逻辑:
TableA::with(['table_b' => function ($query) { $query->wherePivot('active', true); }])->get();
全局过滤(每次查询关联都生效)
如果希望每次查询table_b关联时,都只返回中间表active=true的记录,可以直接在模型的关联定义里加wherePivot条件:
// 在TableA模型中 public function table_b() { return $this->belongsToMany(TableB::class, 'table_pivot') ->wherePivot('active', true); }
之后直接调用TableA::with('table_b')->get(),就能自动过滤符合条件的关联数据。
额外:同时获取中间表字段
如果需要拿到中间表的active字段,可以在关联定义里加上withPivot方法:
public function table_b() { return $this->belongsToMany(TableB::class, 'table_pivot') ->withPivot('active') ->wherePivot('active', true); }
后续获取到的TableB实例,就能通过$tableB->pivot->active访问该中间表字段。
内容的提问来源于stack exchange,提问作者drakanor
相关产品推荐
相关产品推荐

