Laravel find in set排序实例


Posted in PHP onOctober 09, 2019

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

例如,用户状态有四种:

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

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

先上解决方案:

public function index($customer_type = null) {
  $search = request('search');
  $perPage = request('perPage') ? request('perPage') : 10;
  $customer_type = $customer_type ? $customer_type : request('customer_type');
  // \DB::enableQueryLog();
  $data = Customer::select(['id', 'email', 'user_name', 'nick_name', 'status', 'phone', 'create_time'])
    ->where('customer_type', '=', $customer_type)
    ->where(function ($query) use ($search) {
      if ($search) {
        $query->where('user_name', 'like binary', '%' . $search . '%')
          ->orWhere('nick_name', 'like binary', '%' . $search . '%')
          ->orWhere('phone', 'like binary', '%' . $search . '%')
          ->orWhere('email', 'like binary', '%' . $search . '%');
      }
    })
    ->orderByRaw("FIELD(status, " . implode(", ", [1, 2, 0, 3, 4]) . ")")
    ->orderBy('create_time', 'desc')
    ->paginate($perPage);
  // $query = \DB::getQueryLog();
  // dd($data);
  //追加额外参数,例如搜索条件
  $appendData = $data->appends(array(
    'search' => $search,
    'perPage' => $perPage,
  ));
  return view('admin/customer/customerList', compact('data'));
}

打印出来的sql语句如下:

array:2 [?
 => array:3 [?
“query” => “select count(*) as aggregate from customer where customer_type = ?”
“bindings” => array:1 [?
 => “1”
]
“time” => 2.08
]
 => array:3 [?
“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”
“bindings” => array:1 [?
 => “1”
]
“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 复杂应用:

public function get_teacher_list($timeType, $name, $perPage = 10, $personality = 0, $teachingStyle = 0, $ageType = 0)
{
  // \DB::enableQueryLog();
  $result_data = DB::table('teacher_info as ti')
    ->select('ti.*')
    ->join('customer', 'customer.id', '=', 'ti.customer_id')
    ->where(function ($query) use ($personality) {
      if (trim($personality)) {
        $query->whereRaw("find_in_set($personality,ti.label_ids)");
      }
    })
    ->where(function ($query) use ($teachingStyle) {
      if (trim($teachingStyle)) {
        $query->whereRaw("find_in_set($teachingStyle,ti.label_ids)");
      }
    })
    ->where(function ($query) use ($ageType) {
      if (trim($ageType)) {
        $ageType = explode('-', $ageType);
        $query->whereRaw("DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(birthday)), '%Y')+0 between $ageType[0] and $ageType[1]");
      }
    })
    ->where(function ($query) use ($timeType) {
      //1本周,2下周
      if ($timeType == 1) {
        $query->where('ti.can_appointment_1', 1);
      } elseif ($timeType == 2) {
        $query->where('ti.can_appointment_2', 1);
      } else {
        $query->where('ti.can_appointment_1', '>', 0)
          ->orWhere('ti.can_appointment_2', '>', 0);
      }
    })
    ->where(function ($query) use ($name) {
      if (trim($name)) {
        $query->where('ti.chinese_name', 'like', '%' . $name . '%')
          ->orWhere('ti.english_name', 'like', '%' . $name . '%');
      }
    })
    ->where('ti.status', 1)
    ->orderBy('ti.total_teach_num', 'desc')
    ->orderBy('ti.total_star_num', 'desc')
    ->orderBy('ti.satisfaction', 'desc')
    ->orderBy('ti.comment_num', 'desc')
    ->orderBy('ti.english_name', 'asc')
    ->paginate($perPage);
  // dd($result_data, \DB::getQueryLog());

  return $result_data;
}

专门拿出来看一下:

$ids = array(1,17,2);

$ids_ordered = implode(',', $ids);

$items = User::whereIn('id', $ids)
 ->orderByRaw(DB::raw("FIELD(id, $ids_ordered)"))
 ->get();

以上这篇Laravel find in set排序实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP开发中常用的8个小技巧
Aug 27 PHP
php _autoload自动加载类与机制分析
Feb 10 PHP
那些年一起学习的PHP(一)
Mar 21 PHP
PHP 文件编程综合案例-文件上传的实现
Jul 03 PHP
php生成txt文件标题及内容的方法
Jan 16 PHP
PHP empty函数报错解决办法
Mar 06 PHP
PHP设计模式之装饰者模式代码实例
May 11 PHP
php实现图片等比例缩放代码
Jul 23 PHP
PHP输入流php://input实例讲解
Dec 22 PHP
基于swoole实现多人聊天室
Jun 14 PHP
PHP实现支持CURL字符串证书传输的方法
Mar 23 PHP
laravel5表单唯一验证的实例代码
Sep 30 PHP
对laravel in 查询的使用方法详解
Oct 09 #PHP
laravel实现查询最后执行的一条sql语句的方法
Oct 09 #PHP
Laravel使用原生sql语句并调用的方法
Oct 09 #PHP
Laravel 将数据表的数据导出,并生成seeds种子文件的方法
Oct 09 #PHP
laravel执行php artisan migrate报错的解决方法
Oct 09 #PHP
解决Laravel 不能创建 migration 的问题
Oct 09 #PHP
Laravel创建数据库表结构的例子
Oct 09 #PHP
You might like
PHP之数组学习
2011/05/29 PHP
ThinkPHP中的系统常量和预定义常量集合
2014/07/01 PHP
PHP+iFrame实现页面无需刷新的异步文件上传
2014/09/16 PHP
javascript模版引擎-tmpl的bug修复与性能优化分析
2011/10/23 Javascript
如何在父窗口中得知window.open()出的子窗口关闭事件
2013/10/15 Javascript
判断输入是否为空,获得输入类型的JS代码
2013/10/30 Javascript
JavaScript String(字符串)对象的简单实例(推荐)
2016/08/31 Javascript
AngularJS 自定义过滤器详解及实例代码
2016/09/14 Javascript
javascript中Date对象的使用总结
2016/11/21 Javascript
微信小程序 解决请求服务器手机预览请求不到数据的方法
2017/01/04 Javascript
js实现显示手机号码效果
2017/03/09 Javascript
详谈js遍历集合(Array,Map,Set)
2017/04/06 Javascript
信息滚动效果的实例讲解
2017/09/18 Javascript
javascript中new Array()和var arr=[]用法区别
2017/12/01 Javascript
jquery 实现拖动文件上传加载进度条功能
2018/03/18 jQuery
angular2模块和共享模块详解
2018/04/08 Javascript
vue 插件的方法代码详解
2019/06/06 Javascript
[57:36]DOTA2-DPC中国联赛 正赛 SAG vs CDEC BO3 第三场 2月1日
2021/03/11 DOTA
Pyhton中防止SQL注入的方法
2015/02/05 Python
对PyTorch torch.stack的实例讲解
2018/07/30 Python
在python3中pyqt5和mayavi不兼容问题的解决方法
2019/01/08 Python
详解Python函数式编程—高阶函数
2019/03/29 Python
python整合ffmpeg实现视频文件的批量转换
2019/05/31 Python
Python网络爬虫信息提取mooc代码实例
2020/03/06 Python
Python实例教程之检索输出月份日历表
2020/12/16 Python
美国领先的商务贺卡出版商:The Gallery Collection
2018/02/13 全球购物
New Era英国官网:美国棒球帽品牌
2018/03/21 全球购物
英国露营设备和户外服装购物网站:Simply Hike
2019/05/05 全球购物
世界上最大的皮肤科医生拥有和经营的美容网站:LovelySkin
2021/01/03 全球购物
给护士表扬信
2014/01/19 职场文书
采购经理岗位职责
2014/02/16 职场文书
婚礼司仪主持词
2014/03/14 职场文书
优秀大学生求职自荐信范文
2014/04/19 职场文书
法律顾问服务方案
2014/05/15 职场文书
手把手教你用SpringBoot将文件打包成zip存放或导出
2021/06/11 Java/Android
SQL中的连接查询详解
2022/06/21 SQL Server