【问题标题】:Laravel Eloquent ORM: Building nested conditional queriesLaravel Eloquent ORM:构建嵌套条件查询
【发布时间】: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,但随后用户需要检查每个选定标题的正数才能被选中。因此,如果我想搜索经理和员工,我可能会一无所获,因为没有任何用户同时拥有这两个头衔。

目标:

  1. 我想将所有这些条件“标题查询”加在一起。
  2. 将它们全部放在一起 where(function($query) { $query->[all 'title-queries']; })。

其他 cmets:

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

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

  3. 必须是 Eloquent 解决方案。

  4. 用户可以拥有多个头衔。

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

【问题讨论】:

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


    【解决方案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();
    

    【讨论】:

    • 谢谢!您的解决方案有效,我所做的唯一编辑是将 {} 添加到 foreach 循环中。干杯
    猜你喜欢
    • 2019-03-15
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 1970-01-01
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    相关资源
    最近更新 更多