【问题标题】:Laravel 5.3 Constraining Eager Loads not workingLaravel 5.3 约束急切负载不起作用
【发布时间】:2017-05-31 11:05:40
【问题描述】:

我有两个模型 UserProfile 一对一关系。

我想使用以下代码检索profile.status == TRUE 所在的所有用户。

$users = User::with(['profile' => function ($query) {
        $query->where('status', TRUE);
    }])->get();


    dd(count($users)); //50 

我有 50 个用户,其中只有 3 个有 status == TRUE。但它总是显示 50

【问题讨论】:

    标签: php laravel laravel-5 laravel-5.3


    【解决方案1】:

    您将获得 50 个用户,因为您将条件应用于 profiledd($user->profile)你只会得到状态为真的配置文件的记录。

    使用whereHas():

    $users = User::whereHas('profile', function ($query) {
            $query->where('status', TRUE);
        })->get();
    
    dd(count($users));
    

    【讨论】:

    • 但是,有一个问题。出现 N+1 查询问题。
    【解决方案2】:

    如果你想让它与单个查询一起工作,你可以使用查询生成器join like

    \DB::table('users')->join('profile', function ($join){
                            $join->on('users.id', '=', 'profile.user_id')->where('profile.status', '=',TRUE);
                        })->get();
    

    【讨论】:

    • 谢谢,最后我将状态列移动到用户表并使用模型 ORM 查询及其工作。
    【解决方案3】:

    您说您遇到了 N+1 问题,因此您需要像这样使用whereHas()with() 来获取具有个人资料的用户并解决 N+1 问题:

    $users = User::whereHas('profile', function ($query) {
            $query->where('status', TRUE);
        })
        ->with('profile')
        ->get();
    

    【讨论】:

      猜你喜欢
      • 2020-02-26
      • 1970-01-01
      • 2013-05-29
      • 1970-01-01
      • 1970-01-01
      • 2017-04-13
      • 2015-03-19
      • 2015-01-31
      • 1970-01-01
      相关资源
      最近更新 更多