Laravel中用Eloquent获取赛事关联的唯一参赛队模型实例
解决方案:用Eloquent优雅获取赛事的参赛队集合
针对你的需求,这里有两种符合Eloquent最佳实践的优雅实现方式,完全不需要直接使用DB查询构造器:
方法一:在Race模型中定义关联(推荐)
直接在Race模型里新增一个关联方法,利用多对多关联的逻辑(通过participants中间表)来关联Team,同时通过distinct()去重:
// app/Models/Race.php public function teams() { return $this->belongsToMany(Team::class, 'participants') ->distinct(); }
使用的时候就非常简洁,直接调用关联即可获取该赛事下的所有参赛队集合:
$race = Race::find(1); $participatingTeams = $race->teams; // 直接foreach循环使用 foreach ($participatingTeams as $team) { // 操作Team实例,比如$team->name等 }
这个方法的优势是代码复用性高,后续任何地方需要获取赛事的参赛队,都可以直接调用这个关联;同时自动处理了去重,并且因为是和teams表关联,会自动排除team_id为空的参赛者对应的无队情况(毕竟空ID不会匹配到任何Team实例)。
方法二:通过Team模型的关联查询
如果不想修改Race模型,也可以直接通过Team模型的whereHas方法来筛选出有对应赛事参赛者的队伍:
$raceId = 1; $participatingTeams = Team::whereHas('participants', function ($query) use ($raceId) { $query->where('race_id', $raceId); })->get();
whereHas会自动生成关联查询,只返回至少有一个该赛事参赛者的队伍,并且天然保证每个Team只出现一次,不需要额外去重操作。
补充说明
如果需要处理“无队参赛者”的场景(比如统计时要把这类情况算进去),可以额外查询participants表中team_id为空且属于该赛事的记录,手动添加一个虚拟的标识(比如一个临时的Team对象),但如果只是需要获取真正的Team模型实例,上面两种方法已经完全满足需求。
内容的提问来源于stack exchange,提问作者Marc
相关产品推荐
相关产品推荐

