如何在 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 子查询作为选项列表