通过不使用 db raw 自定义查询来排序
Order by not working with db raw custom query
我进行了以下查询
$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);
但它不会return按降序记录。我的其他项目也遇到了同样的问题。
我的意思是为什么 orderby 没有按预期工作?它按升序显示记录。
可能是什么问题和可能的解决方案?
这可能是因为您使用的语法无效。
你应该使用:
DB::table(...)->select(...)->orderBy('id','DESC')->paginate(10);
并且不将原始表达式放入 DB::table
正如 +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方式请求('variable')
我进行了以下查询
$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);
但它不会return按降序记录。我的其他项目也遇到了同样的问题。
我的意思是为什么 orderby 没有按预期工作?它按升序显示记录。
可能是什么问题和可能的解决方案?
这可能是因为您使用的语法无效。
你应该使用:
DB::table(...)->select(...)->orderBy('id','DESC')->paginate(10);
并且不将原始表达式放入 DB::table
正如 +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方式请求('variable')