php - Laravel Eloquent - 使用关系将查询组合成单个查询
问题描述
我正在做一个项目,我正在使用 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(...)
加入查询)。
是否有可能使用更清洁和更简单的 Eloquent 关系方法来实现与“长”手动连接查询相同的结果?
谢谢你的帮助!
解决方案
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();
推荐阅读
- python - 是否可以使用内置的 LogEntry 来跟踪每个用户的操作,而不仅仅是在管理页面中?
- python-3.x - 分割掩码的倒置像素坐标
- .net - 如何在表单之外显示工具提示
- java - 使用“pkexec”打开 .jar 文件并使用桌面条目运行命令
- php - 我想问为什么我对空值列的查询导致空值?
- sql - 基于 SQL 查询的 Powershell 重命名文件
- excel - 检查一行中的三个单元格,如果一个单元格具有特定文本,则取消隐藏该行
- r - 使用 R 中的 Magick 将 .png 转换为多页 pdf
- vba - 使用 Where 组合框更新语句
- pandas - pandas asof 选择下一行而不是最后一行