我有5个用户头衔,由布尔人定义:CEO,执行官,经理,员工&实习生。
我正在构建一个用户搜索API,并希望打开/关闭雄辩查询,返回具有所选标题的用户。
因此,如果我要搜索经理和员工,则查询应为
$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
最后,添加约束的附加内容如下:
$users = $query->where([Additional constraints])->get();
在搜索经理和员工时,最终的查询将是:
$users = User::orWhere('manager')->orWhere('employee')
->where([ADDITIONAL CONSTRAINTS... (like age)])->get();
此查询的结果是并不总是满足其他约束,因为之前有或之前的查询,这允许选择不需要的实例。
我尝试将orWhere替换为where,但是用户需要检查每个所选标题的正数才能被选中。因此,如果我想搜索经理和员工,我可能没有,因为没有任何用户同时拥有这两个头衔。
目标:
补充意见:
我知道我也可以删除所有其他模型,而不是搜索想要的模型。如果我要搜索经理和员工,我可以为每个不需要的标题设置位置('CEO','!=',1)。我不希望这样,因为在某些情况下,具有两个标题的用户(例如员工和临时职位)将被排除在外。
我知道我可以为每个场景编写嵌套的条件查询,即(经理和首席执行官,临时& ceo&执行和......),但这需要25个查询而且不容易如果添加了其他用户标题,则可扩展(指数级更多查询)。
它必须是一个雄辩的解决方案。
用户可以拥有多个标题。
我一直在想这个问题,谢谢!
答案 0 :(得分:1)
也许你可以做这样的事情? (使用使用功能关键字)
<?php
$filters = ['manager', 'employee'];
$users = User::where(function($query) use($filters) {
foreach( $filters as $filter )
$query = $query->orWhere($filter);
})
->where([ADDITIONAL CONSTRAINTS... (like age)])->get();