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 相关文章推荐
一个没有MYSQL数据库支持的简易留言本的编写
Oct 09 PHP
php循环检测目录是否存在并创建(循环创建目录)
Jan 06 PHP
php function用法如何递归及return和echo区别
Mar 07 PHP
ThinkPHP有变量的where条件分页实例
Nov 03 PHP
Linux操作系统安装LAMP环境
Jun 26 PHP
关于PHP 如何用 curl 读取 HTTP chunked 数据
Feb 26 PHP
PHP magento后台无法登录问题解决方法
Nov 24 PHP
PDO操作MySQL的基础教程(推荐)
Aug 18 PHP
postman的安装与使用方法(模拟Get和Post请求)
Aug 06 PHP
PHP添加文字水印或图片水印的水印类完整源代码与使用示例
Mar 18 PHP
PHP中number_format()函数的用法讲解
Apr 08 PHP
PHP扩展类型及安装方式解析
Apr 27 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
实现 win2003 下 mysql 数据库每天自动备份
2006/12/06 PHP
使用cookie实现统计访问者登陆次数
2013/06/08 PHP
PHP中防止SQL注入方法详解
2014/12/25 PHP
PHP实现批量修改文件后缀名的方法
2015/07/30 PHP
Nginx服务器上安装并配置PHPMyAdmin的教程
2015/08/18 PHP
ThinkPHP 3.2.3实现页面静态化功能的方法详解
2017/08/03 PHP
PHP实现的用户注册表单验证功能简单示例
2019/02/25 PHP
在 Laravel 中动态隐藏 API 字段的方法
2019/10/25 PHP
laravel框架邮箱认证实现方法详解
2019/11/22 PHP
基于jquery的关于动态创建DOM元素的问题
2010/12/24 Javascript
JQuery ztree 异步加载实例讲解
2016/02/25 Javascript
星期几的不同脚本写法(推荐)
2016/06/01 Javascript
xmlplus组件设计系列之图标(ICON)(1)
2017/05/05 Javascript
webpack+vue中使用别名路径引用静态图片地址
2017/11/20 Javascript
JS通过位运算实现权限加解密
2018/08/14 Javascript
angularJs select绑定的model取不到值的解决方法
2018/10/08 Javascript
深入理解Vue.js轻量高效的前端组件化方案
2018/12/10 Javascript
解决layer 动态加载select 失效的问题
2019/09/18 Javascript
webpack4从0搭建组件库的实现
2020/11/29 Javascript
swiper实现导航滚动效果
2020/12/13 Javascript
[02:47]2018年度DOTA2最佳辅助位选手4号位-完美盛典
2018/12/17 DOTA
Python中的is和==比较两个对象的两种方法
2017/09/06 Python
Python实现提取XML内容并保存到Excel中的方法
2018/09/01 Python
python使用pyecharts库画地图数据可视化的实现
2020/03/25 Python
python 连续不等式语法糖实例
2020/04/15 Python
Python 实现一行输入多个数字(用空格隔开)
2020/04/29 Python
VSCode配合pipenv搞定虚拟环境的实现方法
2020/05/17 Python
Python手动或自动协程操作方法解析
2020/06/22 Python
Python 用__new__方法实现单例的操作
2020/12/11 Python
实例讲解HTML5的meta标签的一些应用
2015/12/08 HTML / CSS
英国和爱尔兰最大的地毯零售商:Kukoon
2018/12/17 全球购物
瑞士最大的图书贸易公司:Orell Füssli
2019/12/28 全球购物
成人大专自我鉴定范文
2013/10/19 职场文书
党员创先争优承诺书
2014/03/26 职场文书
职场中的你,辞职信写对了吗?
2019/06/26 职场文书
《曾国藩家书》读后感——读家书,立家风
2019/08/21 职场文书