当前位置:首页 > CMS教程 > 其它CMS > 列表

Laravel find in set排序实例

发布:smiling 来源: PHP粉丝网  添加日期:2021-12-28 19:47:48 浏览: 评论:0 

今天小编就为大家分享一篇Laravel find in set排序实例,具有很好的参考价值,希望对大家有所帮助,一起跟随小编过来看看吧。

做项目遇到个需求,需要对结果集中的数据进行指定规则的顺序排列。

例如,用户状态有四种:

=>未激活;1=>正常;2=>禁用;3=>软删除

现在的需求是,我要按照:正常->未激活->禁用->删除;这个顺序来进行排序,同时按照注册时间降序,网上查了很多资料,国内提到这个的很少,在stackOverFlow上找到了答案!

先上解决方案:

  1. public function index($customer_type = null) { 
  2.   $search = request('search'); 
  3.   $perPage = request('perPage') ? request('perPage') : 10; 
  4.   $customer_type = $customer_type ? $customer_type : request('customer_type'); 
  5.   // \DB::enableQueryLog(); 
  6.   $data = Customer::select(['id''email''user_name''nick_name''status''phone''create_time']) 
  7.     ->where('customer_type''='$customer_type
  8.     ->where(function ($queryuse ($search) { 
  9.       if ($search) { 
  10.         $query->where('user_name''like binary''%' . $search . '%'
  11.           ->orWhere('nick_name''like binary''%' . $search . '%'
  12.           ->orWhere('phone''like binary''%' . $search . '%'
  13.           ->orWhere('email''like binary''%' . $search . '%'); 
  14.       } 
  15.     }) 
  16.     ->orderByRaw("FIELD(status, " . implode(", ", [1, 2, 0, 3, 4]) . ")"
  17.     ->orderBy('create_time''desc'
  18.     ->paginate($perPage); 
  19.   // $query = \DB::getQueryLog(); 
  20.   // dd($data); 
  21.   //追加额外参数,例如搜索条件 
  22.   $appendData = $data->appends(array
  23.     'search' => $search
  24.     'perPage' => $perPage
  25.   )); 
  26.   return view('admin/customer/customerList', compact('data')); 

打印出来的sql语句如下:

  1. array:2 [▼ 
  2.  => array:3 [▼ 
  3. “query” => “select count(*) as aggregate from customer where customer_type = ?” 
  4. “bindings” => array:1 [▼ 
  5.  => “1” 
  6. “time” => 2.08 
  7.  => array:3 [▼ 
  8. “query” => “select id, email, user_name, nick_name, status, phone, create_time from customer where customer_type = ? order by FIELD(status, 1, 2, 0, 3, 4), create_time desc limit 10 offset 0” 
  9. “bindings” => array:1 [▼ 
  10.  => “1” 
  11. “time” => 1.2 

参考了以下链接:

https://stackoverflow.com/questions/42068986/laravel-weird-behavior-orderbyrawfield

https://stackoverflow.com/questions/34244455/how-to-use-not-find-in-set-in-laravel-5-1

https://stackoverflow.com/questions/35594450/find-in-set-in-laravel-example/35594503

find_in_set 复杂应用:

  1. public function get_teacher_list($timeType$name$perPage = 10, $personality = 0, $teachingStyle = 0, $ageType = 0) 
  2.   // \DB::enableQueryLog(); 
  3.   $result_data = DB::table('teacher_info as ti'
  4.     ->select('ti.*'
  5.     ->join('customer''customer.id''=''ti.customer_id'
  6.     ->where(function ($queryuse ($personality) { 
  7.       if (trim($personality)) { 
  8.         $query->whereRaw("find_in_set($personality,ti.label_ids)"); 
  9.       } 
  10.     }) 
  11.     ->where(function ($queryuse ($teachingStyle) { 
  12.       if (trim($teachingStyle)) { 
  13.         $query->whereRaw("find_in_set($teachingStyle,ti.label_ids)"); 
  14.       } 
  15.     }) 
  16.     ->where(function ($queryuse ($ageType) { 
  17.       if (trim($ageType)) { 
  18.         $ageType = explode('-'$ageType); 
  19.         $query->whereRaw("DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(birthday)), '%Y')+0 between $ageType[0] and $ageType[1]"); 
  20.       } 
  21.     }) 
  22.     ->where(function ($queryuse ($timeType) { 
  23.       //1本周,2下周 
  24.       if ($timeType == 1) { 
  25.         $query->where('ti.can_appointment_1', 1); 
  26.       } elseif ($timeType == 2) { 
  27.         $query->where('ti.can_appointment_2', 1); 
  28.       } else { 
  29.         $query->where('ti.can_appointment_1''>', 0) 
  30.           ->orWhere('ti.can_appointment_2''>', 0); 
  31.       } 
  32.     }) 
  33.     ->where(function ($queryuse ($name) { 
  34.       if (trim($name)) { 
  35.         $query->where('ti.chinese_name''like''%' . $name . '%'
  36.           ->orWhere('ti.english_name''like''%' . $name . '%'); 
  37.       } 
  38.     }) 
  39.     ->where('ti.status', 1) 
  40.     ->orderBy('ti.total_teach_num''desc'
  41.     ->orderBy('ti.total_star_num''desc'
  42.     ->orderBy('ti.satisfaction''desc'
  43.     ->orderBy('ti.comment_num''desc'
  44.     ->orderBy('ti.english_name''asc'
  45.     ->paginate($perPage); 
  46.   // dd($result_data, \DB::getQueryLog()); 
  47.  
  48.   return $result_data

专门拿出来看一下:

  1. $ids = array(1,17,2); 
  2.  
  3. $ids_ordered = implode(','$ids); 
  4.  
  5. $items = User::whereIn('id'$ids
  6.  ->orderByRaw(DB::raw("FIELD(id, $ids_ordered)")) 
  7.  ->get();

Tags: Laravel find in set

分享到: