Laravel Eloquent-使用关系将查询合并为单个查询

时间:2019-02-05 19:28:38

标签: 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(...))。

是否可以使用更加简洁明了的口才关系方法来实现与“长篇”手动Join-query相同的结果?

感谢您的帮助!

1 个答案:

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