Laravel:如何查询关联完整层级(model/year/trim)的make数据?
Laravel 查询关联完整的Make数据(需关联Model、Year、Trim)
第一步:先确保模型已定义正确关联
根据你的表结构,需要在对应模型中设置好关联关系:
- Make模型(app/Models/Make.php)
public function models() { return $this->hasMany(Model::class, 'id_make'); }
- Model模型(app/Models/Model.php)
public function years() { return $this->hasMany(Year::class, 'id_model'); }
- Year模型(app/Models/Year.php)
public function trims() { return $this->hasMany(Trim::class, 'id_year'); }
第二步:查询符合条件的Make数据
有两种简洁的写法可以实现你的需求:
写法一:用嵌套has()(最便捷)
直接通过链式关联的方式,让Laravel自动筛选出每一层都有关联数据的Make:
$validMakes = Make::has('models.years.trims')->get();
这个方法会自动生成SQL的EXISTS子查询,确保当前Make下至少有一个Model,该Model至少有一个Year,且该Year至少有一个Trim。
写法二:用嵌套whereHas()(适合加额外筛选条件)
如果之后需要给某一层加额外限制(比如只选2010年后的Year),可以用这种更灵活的写法:
$validMakes = Make::whereHas('models', function ($modelQuery) { $modelQuery->whereHas('years', function ($yearQuery) { // 这里可以加额外条件,比如 $yearQuery->where('year', '>=', 2010) $yearQuery->has('trims'); }); })->get();
两种写法最终效果一致,你可以根据是否需要额外筛选条件来选择。
内容的提问来源于stack exchange,提问作者aletede91
相关产品推荐
相关产品推荐

