我正在一个项目中,我正在使用Laravel Eloquent从数据库中获取所有数据。
我将篮球俱乐部,球队和球员存放在不同的桌子中。 现在,我要选择所有属于俱乐部的篮球运动员。
我在Club
模型中创建了一个关系:
public function basketballPlayers()
{
return $this->hasManyThrough('App\Models\Basketball\BasketballPlayer','App\Models\Basketball\BasketballTeam','id','team_id');
}
还有user
模型中的BasketballPlayer
关系:
public function user()
{
return $this->hasOne('App\User','id','user_id');
}
现在,当我执行以下命令时,DB::getQueryLog()
返回3个查询。
Club::findOrFail($club_id)->basketballPlayers()->with('user')->get();
但是当我在不使用关系的情况下执行以下命令时,DB::getQueryLog()
仅返回1个查询。
$players = BasketballPlayer::Join('basketball_teams','basketball_teams.id','=','basketball_players.team_id')
->join('users','users.id','=','basketball_players.user_id')
->where('basketball_teams.club_id','=',$authUser->club_id)
->get(['basketball_players.*','users.firstname','users.lastname','basketball_teams.name']);
我不需要俱乐部和用户提供的所有数据(请参阅“加入”查询中的->get(...)
)。
是否可以使用更加简洁明了的口才关系方法来实现与“长篇”手动Join-query相同的结果?
感谢您的帮助!
答案 0 :(得分:0)
您可以使用with
来读取较少的数据(例如,并非所有用户列)
Club::findOrFail($club_id)
->basketballPlayers()
->with('user:id,firstname,lastname') // <- here is change
->get();
id
(和外键)列很重要。您还应该能够通过以下方式制作嵌套with
(我从头开始编写代码-因此请对其进行测试):
Club::findOrFail($club_id)
->with('BasketballPlayer:id,user_id')
->with('BasketballPlayer.user:id,firstname,lastname')
->get();