【问题标题】:Laravel Eloquent Query With OR WHERE Condition带有 OR WHERE 条件的 Laravel Eloquent 查询
【发布时间】:2020-08-15 19:00:25
【问题描述】:

我正在使用 Laravel 6 和 mysql 7

我有以下查询

$tasks = Task::where('deleted_at', null)->where('company_id',$company_id);
$tasks = $tasks->where('created_by',$user_id);
$tasks = $tasks->orWhereIn('id',$task_ids);

当我打印它时它会生成下面的原始查询

SELECT * FROM `tasks` WHERE `deleted_at` IS NULL AND  `company_id` = 25 AND `created_by` = 20 OR 
`id` IN(112,...215) ORDER BY `id` DESC

现在 ID 112 已被删除,但仍显示在结果中,虽然我有 where('deleted_at', null) 条件但它不起作用

我也想在$task_ids 上应用所有其他条件

如何通过优化查询来实现这一点?

已更新:这是完整的场景

我想选择所有由我创建或分配给我的记录。这是我的完整代码。

 $tasks = Task::where('deleted_at', null)->where('company_id',$company_id);
 $tasks = $tasks->where('created_by',$user_id);
 $task_ids = TaskUser::where('user_id',$user_id)->pluck('task_id')->all();
 $tasks = $tasks->orWhereIn('id',$task_ids);

【问题讨论】:

  • where A and B and C or D,所以id=112记录成功通过条件D。
  • 所以如果你想要condition A (deleted_at is null)condition D (where in 112...) 生效。您可以将您的代码更改为where A and (B and C or D)where (A and B and C) or (A and D)

标签: laravel eloquent where-clause


【解决方案1】:

这是因为 AND 运算符的 precedence 比 OR 更高,这基本上意味着 AND 比 OR 更“粘”在一起。你的查询基本上是这样解释的:

SELECT * FROM `tasks` 
WHERE 
    (`deleted_at` IS NULL AND  `company_id` = 25 AND `created_by` = 20) 
  OR 
    ( `id` IN(112,...215) ) 

我不确定您是否真的想要或任何东西。如果您真的想应用所有条件,只需将orWhereIn 更改为whereIn


如果您想要所有未删除的任务,即属于公司和用户或者其 id 在列表中,您需要像这样更新您的查询:

$tasks = Task::where('deleted_at', null);

$tasks = $tasks->where(function($q) use ($user_id, $task_ids){

    $q->where(function($q2) use ($user_id, $task_ids) {
        $q2->where('created_by',$user_id)
           ->where('company_id',$company_id);
    })
      ->orWhereIn('id',$task_ids);
});

这应该会导致这个查询:

SELECT * FROM `tasks` 
WHERE `deleted_at` IS NULL AND ( 
  ( `company_id` = 25 AND `created_by` = 20 )
  OR
  `id` IN(112,...215) 
) 

在优秀的 laravel 文档中实际上也有一章是关于 parameter grouping 的。

【讨论】:

  • 我不能使用 whereIn 因为我想选择我创建的记录 + 分配给我的记录。我已经更新了我的问题
  • @MuhammadAli 在这种情况下,您需要将公司部分从两个关闭中移出。但是,如何对参数进行分组的总体思路保持不变。你设法得到你想要的结果吗?如果没有,我可以更新我的答案。
猜你喜欢
  • 2014-08-20
  • 1970-01-01
  • 2014-06-28
  • 2017-07-11
  • 1970-01-01
  • 2014-12-08
  • 2016-12-29
  • 2013-06-04
相关资源
最近更新 更多