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

Laravel Eloquent ORM: Building nested conditional queries

我有 5 个用户头衔,由布尔值定义:CEO、执行官、经理、员工和实习生。

我正在构建一个用户搜索 API,并希望转换 on/off 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,但随后用户需要对每个选定的标题进行肯定检查才能被选中。因此,如果我想搜索经理和员工,我可能会得到 none,因为没有任何用户同时拥有这两个头衔。

目标:

  1. 我想将所有这些条件'title-queries'加在一起。
  2. 将它们全部放在一个地方(函数($query){ $query->[all 'title-queries']; })。

补充评论:

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

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

  3. 它必须是一个 Eloquent 解决方案。

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

这个问题我仔细想过了,谢谢!

也许你可以做这样的事情? (使用 use 函数关键字)

<?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();