Laravel多对多关联:如何用Eloquent按中间表is_stock过滤查询红色宝马
解决方案
你可以通过以下几种Eloquent查询方式,实现获取is_stock=1的红色宝马列表:
1. 从Car模型出发(推荐)
通过关联约束筛选出符合条件的宝马,同时预加载对应颜色数据避免N+1查询:
$redBmwStocks = Car::where('name', 'BMW') // 筛选存在符合条件颜色关联的宝马 ->whereHas('colors', function ($query) { $query->where('colors', 'red') ->wherePivot('is_stock', 1); }) // 预加载仅满足条件的颜色关联 ->with(['colors' => function ($query) { $query->where('colors', 'red') ->wherePivot('is_stock', 1); }]) ->get();
2. 从Color模型反向查询
如果需要从颜色维度发起查询:
$redBmwStocks = Color::where('colors', 'red') ->whereHas('cars', function ($query) { $query->where('name', 'BMW') ->wherePivot('is_stock', 1); }) ->with(['cars' => function ($query) { $query->where('name', 'BMW') ->wherePivot('is_stock', 1); }]) ->first() ->cars;
3. 直接通过关联获取中间表匹配记录
若仅需获取关联的颜色模型(包含is_stock字段):
$redBmwStocks = Car::where('name', 'BMW') ->first() ->colors() ->where('colors', 'red') ->wherePivot('is_stock', 1) ->get();
关键说明
wherePivot是Eloquent专门用于筛选多对多中间表字段的方法,刚好匹配你定义的is_stock字段- 所有写法均基于你已配置的
withPivot('is_stock')关联关系,无需额外修改模型
内容的提问来源于stack exchange,提问作者Danial Qsk
相关产品推荐
相关产品推荐

