【问题标题】:How to apply filter conditions gradually without breaking the previous filtering conditions如何在不破坏先前过滤条件的情况下逐步应用过滤条件
【发布时间】:2021-08-20 22:37:19
【问题描述】:

也许这个问题看起来很愚蠢,但我需要了解如何解决它。 在 Laravel 中,我尝试根据用户的选择应用许多条件,如下所示:

$query = Model::query();
if ($request->has('ids')) {
    $query = $query->whereIn('id', $request->get('ids'));
}
if ( ($request->has('fruits')) ) {
    $query = $query->whereHas('fruits', function ($sQuery) use ($list) {
       $sQuery->whereIn('fruit.id', $list);
    });
}
if ($request->has('date')) {
   $query = $query->whereDate('created_at', '>=', $request->get('date'))
              ->orWhereDate('updated_at', '>=', $request->get('date'));
}

事实是关于日期的条件打破了以前的过滤条件。我得到了其他不符合第一个条件的原始数据。我想这是因为 orWhereDate 被用作所有其他条件的“或”条件。如何处理?

【问题讨论】:

  • 有一点需要提一下,不需要像$query = $query->where(...) 那样重新声明$query 变量。你可以修改它$query->where(...)

标签: laravel laravel-5 eloquent laravel-query-builder


【解决方案1】:

我找到了。我更愿意回答我自己的问题而不是删除它。

$query = Model::query();
if ($request->has('ids')) {
    $query = $query->whereIn('id', $request->get('ids'));
}
if ( ($request->has('fruits')) ) {
    $query = $query->whereHas('fruits', function ($sQuery) use ($list) {
       $sQuery->whereIn('fruit.id', $list);
    });
}
if ($request->has('date')) {
   $date = $request->get('date');
   $query->where(function($query) use ($date){
           $query->whereDate('created_at', '>=', $date)
              ->orWhereDate('updated_at', '>=', $date);
   });
}

希望这可以快速帮助某人。

【讨论】:

  • 我建议你放弃在任何地方使用if(为了雄辩)并开始使用when
  • 有趣的@matiaslauriti。不知道,谢谢
猜你喜欢
  • 1970-01-01
  • 2016-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-23
  • 2019-01-03
相关资源
最近更新 更多