首页 > 解决方案 > 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 关系方法来实现与“长”手动连接查询相同的结果?

谢谢你的帮助!

标签: phplaraveleloquent

解决方案


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();

推荐阅读