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 安装最快的解决办法
Aug 01 PHP
php中通过curl模拟登陆discuz论坛的实现代码
Feb 16 PHP
深入PHP操作MongoDB的技术总结
Jun 02 PHP
CI框架学习笔记(一) - 环境安装、基本术语和框架流程
Oct 26 PHP
PHP实现的一致性哈希算法完整实例
Nov 14 PHP
Linux(CentOS)下PHP扩展PDO编译安装的方法
Apr 07 PHP
PHP简单留言本功能实现代码
Jun 09 PHP
php使用ftp实现文件上传与下载功能
Jul 21 PHP
php微信公众号开发之欢迎老朋友
Oct 20 PHP
PHP实现获取ip地址的5种方法,以及插入用户登录日志操作示例
Feb 28 PHP
简单实用的PHP文本缓存类实例
Mar 22 PHP
ThinkPHP5框架中使用JWT的方法示例
Jun 03 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备份/还原MySQL数据库的代码
2011/01/06 PHP
PHP __autoload函数(自动载入类文件)的使用方法
2012/02/04 PHP
php实现邮件发送并带有附件
2014/01/24 PHP
php实现把数组按指定的个数分隔
2014/02/17 PHP
PHP判断文章里是否有图片的简单方法
2014/07/26 PHP
PHP中set error handler函数用法小结
2015/11/11 PHP
php简单计算权重的方法示例【适合抽奖类应用】
2019/06/10 PHP
让mayfish支持mysqli数据库驱动的实现方法
2010/05/22 Javascript
javascript之典型高阶函数应用介绍二
2013/01/10 Javascript
javascrip关于继承的小例子
2013/05/10 Javascript
ES6使用let命令更简单的实现块级作用域实例分析
2017/03/31 Javascript
Vue中保存用户登录状态实例代码
2017/06/07 Javascript
vue中引用阿里字体图标的方法
2018/02/10 Javascript
如何解决vue2.0下IE浏览器白屏问题
2018/09/13 Javascript
vue+axios全局添加请求头和参数操作
2020/07/24 Javascript
vue-quill-editor的使用及个性化定制操作
2020/08/04 Javascript
基于javascript原生判断DOM是否加载完毕
2020/10/14 Javascript
深入理解Python变量与常量
2016/06/02 Python
基于python的七种经典排序算法(推荐)
2016/12/08 Python
详解Golang 与python中的字符串反转
2017/07/21 Python
Django实战之用户认证(用户登录与注销)
2018/07/16 Python
python实现栅栏加解密 支持密钥加密
2019/03/20 Python
Python多线程threading模块用法实例分析
2019/05/22 Python
使用python获取(宜宾市地震信息)地震信息
2019/06/20 Python
Python:二维列表下标互换方式(矩阵转置)
2019/12/02 Python
Fanatics法国官网:美国体育电商
2019/08/27 全球购物
医师定期考核实施方案
2014/05/07 职场文书
大专应届毕业生求职信
2014/07/15 职场文书
关于诚信的活动方案
2014/08/18 职场文书
个人授权委托书格式
2014/08/30 职场文书
优秀团员事迹材料1500字
2014/08/31 职场文书
司法局群众路线教育实践活动开展情况总结
2014/10/25 职场文书
颐和园导游词400字
2015/01/30 职场文书
志愿服务心得体会
2016/01/15 职场文书
《黄道婆》教学反思
2016/02/22 职场文书
Go gorilla/sessions库安装使用
2022/08/14 Golang