【问题标题】:Laravel Eloquent - Combining queries to single one using relationsLaravel Eloquent - 使用关系将查询组合成单个查询
【发布时间】:2019-06-29 16:52:50
【问题描述】:

我正在做一个项目,我正在使用 Laravel Eloquent 从我的数据库中获取我的所有数据。

我将篮球俱乐部、球队和球员存放在不同的桌子上。 现在我想选择属于某个俱乐部的球队的所有篮球运动员。

我在Club 模型中创建了一个关系:

public function basketballPlayers()
    {
        return $this->hasManyThrough('App\Models\Basketball\BasketballPlayer','App\Models\Basketball\BasketballTeam','id','team_id');
    }

user 模型中的 user 关系:

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 关系方法获得与“长”手动联接查询相同的结果?

感谢您的帮助!

【问题讨论】:

    标签: php laravel eloquent


    【解决方案1】:

    您可以使用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();
    

    【讨论】:

    • 但这仍然需要三个查询。这不是性能问题吗?我创建的第二个查询通过一个查询获取所有内容。是否可以使用关系与单个查询获得相同的输出?
    • @Mike_NotGuilty 我更新了答案,但据我所知,使用with 减少查询数量并不容易——所以我只能与你分享这个小小的改进
    • 感谢您的帮助。这不会提高查询的数量。所以我唯一能做的就是使用自定义 Join 查询以将性能和查询保持在最低水平?
    • 据我所知是的-但是等待其他人的答案-也许有人会找到更好的方法(包括使用外部库)
    • 您可以使用带有 load() 函数的延迟加载。它仍将使用 3 个查询,但您实际上只能在需要时获取数据。它只是一种仅在您需要项目时才延迟查询的方法。但是为了安全起见,我也同意卡米尔的观点,即使用 join 会给你一个查询。如果你在 MySQL 中设置了键的索引,它会加快速度
    猜你喜欢
    • 2013-10-03
    • 2017-07-19
    • 2014-10-31
    • 2021-09-25
    • 2015-01-21
    • 2017-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多