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获取php,mysql,apche的版本信息示例代码
Jan 16 PHP
php读取纯真ip数据库使用示例
Jan 26 PHP
php教程之魔术方法的使用示例(php魔术函数)
Feb 12 PHP
详解PHP中strlen和mb_strlen函数的区别
Mar 07 PHP
Yii中render和renderPartial的区别
Sep 03 PHP
php获取一个变量的名字的方法
Sep 05 PHP
php输出xml必须header的解决方法
Oct 17 PHP
yii中widget的用法
Dec 03 PHP
php多线程实现方法及用法实例详解
Oct 26 PHP
php使用ZipArchive函数实现文件的压缩与解压缩
Oct 27 PHP
Thinkphp无限级分类代码
Nov 11 PHP
php用户密码加密算法分析【Discuz加密算法】
Oct 12 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
做一个有下拉功能的留言版
2006/10/09 PHP
PHP中CURL方法curl_setopt()函数的参数分享
2013/01/19 PHP
深入Apache与Nginx的优缺点比较详解
2013/06/17 PHP
PHP小教程之实现链表
2014/06/09 PHP
ThinkPHP应用模式扩展详解
2014/07/16 PHP
jQuery Select(单选) 模拟插件 V1.3.62 改进版
2010/07/17 Javascript
网站页面自动跳转实现方法PHP、JSP(上)
2010/08/01 Javascript
关于JS管理作用域的问题
2013/04/10 Javascript
node.js中使用q.js实现api的promise化
2014/09/17 Javascript
js style动态设置table高度
2014/10/21 Javascript
浅谈JavaScript function函数种类
2014/12/29 Javascript
详解微信小程序 wx.uploadFile 的编码坑
2017/01/23 Javascript
Vue-cli 使用json server在本地模拟请求数据的示例代码
2017/11/02 Javascript
JS闭包经典实例详解
2018/12/20 Javascript
jquery获取file表单选择文件的路径、名字、大小、类型
2019/01/18 jQuery
ES6基础之数组和对象的拓展实例详解
2019/08/22 Javascript
JavaScript 面向对象程序设计详解【类的创建、实例对象、构造函数、原型等】
2020/05/12 Javascript
Node.js API详解之 net模块实例分析
2020/05/18 Javascript
[56:20]LGD vs VP Supermajor 败者组决赛 BO3 第三场 6.10
2018/07/04 DOTA
[51:07]VGJ.S vs Pain 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
Python中使用logging模块代替print(logging简明指南)
2014/07/09 Python
详解C++编程中一元运算符的重载
2016/01/19 Python
使用OpenCV实现仿射变换—旋转功能
2019/08/29 Python
python datetime中strptime用法详解
2019/08/29 Python
浅谈Selenium 控制浏览器的常用方法
2020/12/04 Python
LookFantastic丹麦:英国美容护肤精品在线商城
2016/08/18 全球购物
Blancsom美国/加拿大:服装和生活用品供应商
2018/07/27 全球购物
如何用PHP实现邮件发送
2012/12/26 面试题
介绍一下write命令
2012/09/24 面试题
韩国商务邀请函
2014/01/14 职场文书
医学生毕业自我鉴定
2014/03/26 职场文书
爱护公共设施的标语
2014/06/24 职场文书
投诉信格式范文
2015/07/02 职场文书
Python Flask搭建yolov3目标检测系统详解流程
2021/11/07 Python
Android 中的类文件和类加载器详情
2022/06/05 Java/Android