【问题标题】:How to Write Sub Query in With()?如何在 With() 中编写子查询?
【发布时间】:2019-09-02 21:52:40
【问题描述】:

我必须获取特定数据,例如“角色”表已提交 status,并且我需要 status = 1 以便所有数据都从角色表中获取

$result = User::select()
    ->with('roles')
    ->where('email', $email)
    ->get();
    return $result;

【问题讨论】:

    标签: laravel eloquent


    【解决方案1】:

    按照这个问题的答案:Laravel - Eloquent "Has", "With", "WhereHas" - What do they mean? 如果我正确理解了您的数据模型的结构:

    • 用户有很多角色
    • 角色具有属性状态
    • 想要按状态过滤 = 1
    $users = User::whereHas('roles', function($q){
        $q->where('status', '1');
    })
    ->where('email', $email)
    ->get();
    

    编辑:我对上面的答案不满意,因为据我了解,在这种情况下,返回的用户没有加载角色列表,所以我检查了文档 (https://laravel.com/docs/5.8/eloquent-relationships) 并给出了我找到了,下面的代码应该能满足你的要求:

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

    我从来没有用过 eloquent 和 laravel,也不是 php 开发者,所以我无法尝试这个 sn-p,如果不正确请告诉我。

    【讨论】:

    • 作为 Laravel 开发者;你是对的。此代码将获取用户及其角色(急切加载),但仅获取角色查询返回 true 的用户。
    【解决方案2】:

    你可以像这样写子查询

    $result = User::select()
        ->with(['roles' => function($q){    
             $q->where('status', 1);
        }])
        ->where('email', $email)
        ->get();
        return $result;
    

    【讨论】:

    • 出于好奇,是否需要 select()?我应该更正我的答案吗?
    猜你喜欢
    • 1970-01-01
    • 2010-12-10
    • 2015-05-17
    • 2017-05-25
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 2022-01-03
    • 2020-04-13
    相关资源
    最近更新 更多