Laravel Eloquent ORM:构建嵌套条件查询

时间:2016-10-25 20:53:23

标签: php eloquent laravel-5.2 conditional nested-queries

我有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,但是用户需要检查每个所选标题的正数才能被选中。因此,如果我想搜索经理和员工,我可能没有,因为没有任何用户同时拥有这两个头衔。

目标:

  1. 我想将所有这些有条件的'title-queries'加在一起。
  2. 将它们放在一个(function($ query){$ query-> [all'title-queries'];})中。
  3. 补充意见:

    1. 我知道我也可以删除所有其他模型,而不是搜索想要的模型。如果我要搜索经理和员工,我可以为每个不需要的标题设置位置('CEO','!=',1)。我不希望这样,因为在某些情况下,具有两个标题的用户(例如员工和临时职位)将被排除在外。

    2. 我知道我可以为每个场景编写嵌套的条件查询,即(经理和首席执行官,临时& ceo&执行和......),但这需要25个查询而且不容易如果添加了其他用户标题,则可扩展(指数级更多查询)。

    3. 它必须是一个雄辩的解决方案。

    4. 用户可以拥有多个标题。

    5. 我一直在想这个问题,谢谢!

1 个答案:

答案 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();