如何在 With() 中编写子查询?

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案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()?我应该更正我的答案吗?

以上是关于如何在 With() 中编写子查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何在标准 SQL 的 WHERE 子句中使用 WITH 子查询作为选项列表

Oracle with重用子查询

如何在雪花中编写相关子查询

如何在 laravel 8 中编写子查询?

如何在此查询的 codeigniter 活动记录中编写子查询

如何识别查询语句中有子查询?