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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 14:33:19