Laravel Eloquent:获取车主车辆的二级关联品牌实体
嗨,针对你遇到的这个问题,我整理了几个实用的方案,帮你直接拿到目标的Brand集合,不用先处理带品牌的车辆集合:
方案一:定义
belongsToMany关联(推荐) 既然一个车主的车辆对应多个品牌(本质是多对多关系,通过cars表作为中间关联表),可以直接在Owner模型里新增一个brands关联:
// App\Models\Owner.php public function brands() { return $this->belongsToMany(Brand::class, 'cars', 'owner_id', 'brand_id') ->distinct(); // 加上去重,避免同一品牌重复出现在结果里 }
之后你就能直接调用获取品牌集合了:
// 获取单个车主的品牌集合 $owner->brands; // 或者预加载关联,优化查询性能 $owner = Owner::with('brands')->find($targetOwnerId); $brands = $owner->brands;
这个方案最贴合Eloquent的设计理念,代码简洁还能利用ORM的预加载机制优化数据库查询。
方案二:从现有Car集合中提取Brand
如果不想新增模型关联,也可以基于你现有的查询,通过集合操作提取品牌:
// 先获取带brand关联的车辆集合,再提取品牌并去重 $brands = $owner->cars()->with('brand')->get() ->pluck('brand') // 提取每辆车对应的brand实例 ->filter() // 过滤掉可能存在的null值(比如某辆车未关联品牌的情况) ->unique('id'); // 根据品牌ID去重,避免重复
执行后$brands就是纯净的Brand集合了。
方案三:直接使用DB查询构建器
如果你的数据量较大,追求极致的查询性能,可以直接编写数据库查询语句:
$brands = Brand::whereIn('id', function($query) use ($targetOwnerId) { $query->select('brand_id') ->from('cars') ->where('owner_id', $targetOwnerId); })->distinct()->get();
这个方案生成的SQL语句更简洁,能减少不必要的ORM开销。
内容的提问来源于stack exchange,提问作者davidinho
相关产品推荐
相关产品推荐

