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 相关文章推荐
深入Memcache的Session数据的多服务器共享详解
Jun 13 PHP
浅析php header 跳转
Jun 17 PHP
php中sql注入漏洞示例 sql注入漏洞修复
Jan 24 PHP
ThinkPHP模板判断输出Empty标签用法详解
Jun 30 PHP
PHP反射使用实例和PHP反射API的中文说明
Jul 02 PHP
PHP错误Warning:mysql_query()解决方法
Oct 24 PHP
php获取给定日期相差天数的方法分析
Feb 20 PHP
PHP如何获取当前主机、域名、网址、路径、端口等参数
Jun 09 PHP
PHP7新特性之抽象语法树(AST)带来的变化详解
Jul 17 PHP
PHP PDOStatement::debugDumpParams讲解
Jan 30 PHP
微信公众平台开发教程③ PHP实现微信公众号支付功能图文详解
Apr 10 PHP
PHP __call()方法实现委托示例
May 20 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获取Google AJAX Search API 数据的代码
2010/03/12 PHP
PHP number_format() 函数定义和用法
2012/06/01 PHP
php与flash as3 socket通信传送文件实现代码
2014/08/16 PHP
CentOS安装php v8js教程
2015/02/26 PHP
js实现飞入星星特效代码
2014/10/17 Javascript
JavaScript极简入门教程(二):对象和函数
2014/10/25 Javascript
Javascript动态创建div的方法
2015/02/09 Javascript
JS获取网页图片name属性的方法
2015/04/01 Javascript
Javascript非构造函数的继承
2015/04/27 Javascript
jQuery动态星级评分效果实现方法
2015/08/06 Javascript
CSS javascript 结合实现悬浮固定菜单效果
2015/08/23 Javascript
将JavaScript的jQuery库中表单转化为JSON对象的方法
2015/11/17 Javascript
利用transition实现文字上下抖动的效果
2017/01/21 Javascript
jQuery多选框选择数量限制方法
2017/02/08 Javascript
JavaScript使用readAsDataUrl方法预览图片
2017/05/10 Javascript
Vue中使用vux配置代码详解
2018/09/16 Javascript
微信小程序当前时间时段选择器插件使用方法详解
2018/12/28 Javascript
一篇文章介绍redux、react-redux、redux-saga总结
2019/05/23 Javascript
node中使用log4js4.x版本记录日志的方法
2019/08/20 Javascript
vue 实现setInterval 创建和销毁实例
2020/07/21 Javascript
Python图形绘制操作之正弦曲线实现方法分析
2017/12/25 Python
pandas数据分组和聚合操作方法
2018/04/11 Python
Django 创建新App及其常用命令的实现方法
2019/08/04 Python
英国最大的宠物食品和宠物用品网上零售商: Zooplus
2016/08/01 全球购物
Vince官网:全球著名设计师品牌,休闲而优雅的服饰
2017/01/15 全球购物
delegate与普通函数的区别
2014/01/22 面试题
介绍一下linux的文件系统
2015/10/06 面试题
大学生军训广播稿
2014/01/24 职场文书
市场开发计划书
2014/05/07 职场文书
公司周年庆典策划方案
2014/05/17 职场文书
个人三严三实对照检查材料思想汇报
2014/09/22 职场文书
检查机关党的群众路线个人整改措施
2014/10/04 职场文书
安全教育的主题班会
2015/08/13 职场文书
2016入党积极分子党课学习心得体会
2015/10/09 职场文书
Python insert() / append() 用法 Leetcode实战演示
2021/03/31 Python
MySQL 原理优化之Group By的优化技巧
2022/08/14 MySQL