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实现mysql数据库备份类
Mar 20 PHP
php中实现简单的ACL 完结篇
Sep 07 PHP
基于php 随机数的深入理解
Jun 05 PHP
PHP APC配置文件2套和参数详解
Jun 11 PHP
PHP页面实现定时跳转的方法
Oct 31 PHP
PHP批量去除BOM头代码分享
Jun 26 PHP
php提取身份证号码中的生日日期以及验证是否为成年人的函数
Sep 29 PHP
深入理解PHP内核(二)之SAPI探究
Nov 10 PHP
Laravel最佳分割路由文件(routes.php)的方式
Aug 04 PHP
php静态成员方法和静态的成员属性的使用方法
Oct 26 PHP
php利用ob_start()清除输出和选择性输出的方法
Jan 18 PHP
PHP lcfirst()函数定义与用法
Mar 08 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 将json格式数据转换成数组的方法
2018/08/21 PHP
jquery随机展示头像代码
2011/12/21 Javascript
EditPlus注册码生成器(js代码实现)
2013/03/25 Javascript
NodeJS学习笔记之网络编程
2014/08/03 NodeJs
nodejs 中模拟实现 emmiter 自定义事件
2016/02/22 NodeJs
iScroll.js 使用方法参考
2016/05/16 Javascript
AngularJS改变元素显示状态
2017/04/20 Javascript
jQuery dateRangePicker插件使用方法详解
2017/07/28 jQuery
vue数据控制视图源码解析
2018/03/28 Javascript
详解基于 Node.js 的轻量级云函数功能实现
2019/07/08 Javascript
JavaScript中的连续赋值问题实例分析
2019/07/12 Javascript
Ant design vue table 单击行选中 勾选checkbox教程
2020/10/24 Javascript
vue打开其他项目页面并传入数据详解
2020/11/25 Vue.js
Python中List.count()方法的使用教程
2015/05/20 Python
python通过cookie模拟已登录状态的初步研究
2016/11/09 Python
Python函数式编程
2017/07/20 Python
python 绘制拟合曲线并加指定点标识的实现
2019/07/10 Python
pyftplib中文乱码问题解决方案
2020/01/11 Python
python json 递归打印所有json子节点信息的例子
2020/02/27 Python
Pycharm的Available Packages为空的解决方法
2020/09/18 Python
Python可以用来做什么
2020/11/23 Python
详解Python Celery和RabbitMQ实战教程
2021/01/20 Python
党校自我鉴定范文
2013/10/02 职场文书
本科毕业生自我鉴定
2013/11/02 职场文书
大学生军训自我鉴定
2014/02/12 职场文书
幼儿园小班评语大全
2014/04/17 职场文书
保证书范文大全
2014/04/28 职场文书
分公司经理任命书
2014/06/05 职场文书
金融保险专业求职信
2014/09/03 职场文书
小学一年级学生评语大全
2014/12/25 职场文书
2015年社区科普工作总结
2015/05/13 职场文书
复兴之路纪录片观后感
2015/06/02 职场文书
运动会通讯稿50字
2015/07/20 职场文书
大学生活委员竞选稿
2015/11/21 职场文书
三严三实·严以修身心得体会
2016/01/15 职场文书
测量JavaScript函数的性能各种方式对比
2021/04/27 Javascript