Laravel闭包中OrderBy排序不生效的问题

问题背景:
后台写到一个列表页面,需要传递条件进行排序列表,如图


但这个条件也可以选择不传递。因此后台就需要判断是否传递了这个排序请求,进行对应的数据查询

牛刀小试

首先还是简单一想,那就直接后台判断是否接收到参数嘛。

        $opts = Request::input('searchOptions');
        DB::table('table_name')->where(function ($query) use ($opts) {
            if($opts['timeOrder']){
                switch ($opts['timeOrder']){
                    case 1:
                        $query->orderBy('indate','asc');
                        break;
                    case 2:
                        $query->orderBy('indate','desc');
                        break;
                    case 3:
                        $query->orderBy('reply_time','desc');
                        break;
                    case 4:
                        $query->orderBy('reply_time','desc');
                        break;
                }

            }else{
                $query->orderBy('id','desc');
            }

        })->get();

然鹅,当我改变条件时,并不生效。数据依然是默认排序(id正序)。于是,开始翻文档。不得不说,文档是个好(cang)东(tai)西(shen)。


条件语句#

有时你可能想要子句只适用于某个情况为真时才执行查询。例如,如果给定的输入值出现在传入请求中时,你可能想要判断它能达成某个 where 语句,你可以使用 when 方法来完成此操作:


$users = DB::table('users')
                ->when($role, function ($query) use ($role) {
                    return $query->where('role_id', $role);
                })
                ->get();

只有当 when 方法的第一个参数为 true 时,闭包里的 where 语句才会执行。如果第一个参数是 false,这个闭包将不会被执行。
你可以将另一个闭包当作第三个参数传递给 when 方法。如果第一个参数的值为 false 时,这个闭包将执行。为了说明如何使用此功能,我们将使用它配置查询的默认排序:

$sortBy = null;

$users = DB::table('users')
                ->when($sortBy, function ($query) use ($sortBy) {
                    return $query->orderBy($sortBy);
                }, function ($query) {
                    return $query->orderBy('name');
                })
                ->get();

嗯...看的我是恍然大悟~


于是嘛,一通改。最后如下:

            if($opts['timeOrder']){
                $optsOrder = true;
                $optsDefault = false;
            }else{
                $optsOrder = false;
                $optsDefault = true;
            }
             $lists = DB::table('orders_eva')->where($where)->when($optsOrder,function ($query) use ($opts) {
                    switch ($opts['timeOrder']){
                        case 1:
                            return $query->orderBy('indate','asc');
                            break;
                        case 2:
                            return $query->orderBy('indate','desc');
                            break;
                        case 3:
                            return $query->orderBy('reply_time','desc');
                            break;
                        case 4:
                            return $query->orderBy('reply_time','desc');
                            break;
                    }

            })->when($optsDefault,function ($query) use ($opts){
                return $query->orderBy('id','desc');
            })->get();

好了生效了。填坑小日记。如有错误,还望指正。谢谢~

你可能感兴趣的:(Laravel闭包中OrderBy排序不生效的问题)