使用Eloquent查询过滤器返回所有记录

时间:2017-12-05 16:11:19

标签: php laravel eloquent

我正在构建一个表单,允许用户从多个选项中进行选择,并根据这些选项从DB中检索结果。我在创建查询过滤器方面取得了成功,但在我想要添加选项时,我遇到了问题,并且从所有时间选择记录'而不是特定年份。

我的代码如下:

$order = (new Order)->newQuery();

    if ($request->has('report')) {
        if($request->report === 'all') {
            $order->where('status', 'approved')
            ->orWhere('status', 'pending')
            ->orWhere('status', 'denied');
        } else {
            $order->where('status', $request->report);
        } 
    }

    if($request->has('supervisors')) {
        $order->where(function($query) use ($request) {
            foreach ($request->supervisors as $key => $supervisor) {
                if ($key == 0)  {
                    $query->where('supervisor_id', $supervisor);
                } else {
                    $query->orWhere('supervisor_id', $supervisor);
                }
            }
        });
    }


    if($request->dateFrom !== null) {
        $order->whereBetween('created_at', 
            [
                Carbon::parse($request->dateFrom), 
                Carbon::parse($request->dateTo)
            ]);
    } elseif($request->has('year') !== null) {
        $order->whereYear('created_at', $request->year);
    } 
    if(isset($request->allTime)) {
        $order;
    }
    return $order->get();

有问题的部分在这里:

if(isset($request->allTime)) {
    $order;
}

我的理解是,如果没有对dateFrom或Year进行过滤,那么它应该默认返回所有项目,但这不会发生。我收到一个空白的结果。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

如果您不需要一直添加任何过滤,那么您可以省略它或将if块留空

if(isset($request->allTime)) { }

您还应该修复$request->has('year') !== null,因为它看起来像是两个条件 $ request-> has('year')总是返回true或false,具体取决于Request中是否存在年份。 true或false永远不会== null

$request->has('year') && $request->year !== null