Laravel 如何在不破坏先前过滤条件的情况下逐渐应用过滤条件

Laravel 如何在不破坏先前过滤条件的情况下逐渐应用过滤条件,laravel,laravel-5,eloquent,laravel-query-builder,Laravel,Laravel 5,Eloquent,Laravel Query Builder,也许这个问题看起来很愚蠢,但我需要学习如何解决它。 在Laravel中,我尝试根据用户的选择应用许多条件,如下所示: $query = Model::query(); if ($request->has('ids')) { $query = $query->whereIn('id', $request->get('ids')); } if ( ($request->has('fruits')) ) { $query = $query->whereHa

也许这个问题看起来很愚蠢,但我需要学习如何解决它。 在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'));
}

事实上,有关日期的条件打破了以前的筛选条件。我得到的其他分数与第一个条件不匹配。我猜这是因为或wheredate被用作所有其他条件的“或”。如何处理这个问题?

我找到了。我宁愿回答我自己的问题也不愿删除它

$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
(为了口才),开始使用有趣的@matiaslauriti。我不知道,谢谢一件小事,没有必要像
$query=$query->where(…)
那样重新声明
$query
变量。您只需修改它
$query->where(…)