通过不使用db raw自定义查询来排序

时间:2017-05-06 14:47:25

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

我做了以下查询

$query = 'select cdo.id, cdo.user_id, cdo.created_at, cdo.updated_at, cdo.shipping_charges from certi_dia_orders cdo inner join users u on cdo.user_id = u.id where cdo.type = "Order"';

if(isset($_REQUEST['order-status']) && strtolower($_REQUEST['order-status']) == 'pending'){
        $query .= ' and cdo.status = "under process"';
      } else if(isset($_REQUEST['order-status']) && strtolower($_REQUEST['order-status']) == 'delivered'){
        $query .= ' and cdo.status = "delivered"';
      } else if(isset($_REQUEST['order-status']) && strtolower($_REQUEST['order-status']) == 'all'){

      } else {
        $query .= ' and cdo.status = "under process"';
      }

      if(isset($_REQUEST['buyer_username']) && $_REQUEST['buyer_username']!=''){
        $query .= ' and u.username like "%'.addslashes($_REQUEST['buyer_username']).'%"';
      }

      if(isset($_REQUEST['date_from']) && $_REQUEST['date_from']!='' && isset($_REQUEST['date_to']) && $_REQUEST['date_to']!='' && strtotime($_REQUEST['date_to']) > strtolower($_REQUEST['date_from'])){
        $query .= ' and (cdo.created_at between "'.addslashes($_REQUEST['date_from']).'" and "'.addslashes($_REQUEST['date_to']).'")';
      }

$order = DB::table(DB::raw("(".$query.") as tbl"))->orderBy('id','desc')->paginate(10);

但它不会按照降序返回记录。我的其他项目也遇到了同样的问题。

我的意思是为什么orderby没有按预期工作?它以加速顺序显示记录。

可能有什么问题和可能的解决方案?

2 个答案:

答案 0 :(得分:1)

正如+ marcin-nabiałek所说,你必须写一个用正确指南编写的有效语法。 你的代码必须这样写:

$order = DB::table('certi_dia_orders as cdo')
        ->leftJoin('users as u', 'cdo.user_id', '=', 'u.id')
        ->select(['cdo.id, cdo.user_id, cdo.status, cdo.created_at, cdo.updated_at, cdo.shipping_charges, u.id'])
        ->where('cdo.type', 'Order');

    if (isset($_REQUEST['order-status']) && strtolower($_REQUEST['order-status']) == 'pending') {
        $order->where('cdo.status', '=', 'under process');
    } else {
        if (isset($_REQUEST['order-status']) && strtolower($_REQUEST['order-status']) == 'delivered') {
            $order->where('cdo.status', '=', 'delivered');
        } else {
            if (isset($_REQUEST['order-status']) && strtolower($_REQUEST['order-status']) == 'all') {

            } else {
                $order->where('cdo.status', '=', 'under process');
            }
        }
    }

    if (isset($_REQUEST['buyer_username']) && $_REQUEST['buyer_username'] != '') {
        $order->where('u.username', 'like', '%' . addslashes($_REQUEST['buyer_username']) . '%');
    }

    if (isset($_REQUEST['date_from']) && $_REQUEST['date_from'] != '' && isset($_REQUEST['date_to']) && $_REQUEST['date_to'] != '' && strtotime($_REQUEST['date_to']) > strtolower($_REQUEST['date_from'])) {
        $order->whereBetween('cdo.created_at', [
            addslashes($_REQUEST['date_from']),
            addslashes($_REQUEST['date_to']),
        ]);
    }

    $orders = $order->orderBy('cdo.id', 'desc')->paginate(10);

另一个推荐的事情,而不是 $ _ REQUEST ['variable'] 使用laravel方式请求('变量')

答案 1 :(得分:0)

这可能是因为您使用了无效的语法。

您应该使用:

 DB::table(...)->select(...)->orderBy('id','DESC')->paginate(10);

并且不将原始表达式放在DB::table

Reference