【发布时间】:2016-10-25 20:53:23
【问题描述】:
我有 5 个用户头衔,由布尔值定义:CEO、执行官、经理、员工和实习生。
我正在构建一个用户搜索 API,并希望打开/关闭 eloquent 查询,返回具有选定标题的用户。
所以如果我要搜索经理和员工,查询应该是
$users = User::where(function($query)
{
$query->orWhere('manager')->orWhere('employee');
})
->where([ADDITIONAL CONSTRAINTS... (like age)])->get();
我来的最远的是:
$query = User::query();
//the respective titles are turned on by 1 and turned off by 0
if($CEO) {
$query = $query->orWhere('CEO');
}
if($executive) {
$query = $query->orWhere('executive');
}
//And so on for each title
最后,额外的 where 约束是这样添加的:
$users = $query->where([Additional constraints])->get();
在搜索经理和员工时,最终的查询是:
$users = User::orWhere('manager')->orWhere('employee')
->where([ADDITIONAL CONSTRAINTS... (like age)])->get();
此查询的结果是附加约束并不总是得到满足,因为之前有 orwhere 查询,这允许选择不需要的实例。
我尝试将 orWhere's 替换为 where's,但随后用户需要检查每个选定标题的正数才能被选中。因此,如果我想搜索经理和员工,我可能会一无所获,因为没有任何用户同时拥有这两个头衔。
目标:
- 我想将所有这些条件“标题查询”加在一起。
- 将它们全部放在一起 where(function($query) { $query->[all 'title-queries']; })。
其他 cmets:
我知道我也可以消除所有其他模型,而不是搜索想要的模型。如果我要搜索经理和员工,我可以为每个不需要的头衔设置 where('CEO', '!=', 1)。我不希望这样,因为在某些情况下,拥有两个头衔的用户(例如员工和临时员工)会被排除在外。
我知道我可以为每个场景编写嵌套条件查询,即(经理 & ceo、临时 & ceo & 行政人员等等),但这需要 25 个查询,而且不容易扩展(指数更多查询)如果添加了其他用户标题。
必须是 Eloquent 解决方案。
用户可以拥有多个头衔。
这个问题我仔细考虑过了,谢谢!
【问题讨论】:
标签: php eloquent laravel-5.2 conditional nested-queries