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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 02:30:04