Laravel find in set排序实例
做项目遇到个需求,需要对结果集中的数据进行指定规则的顺序排列。
例如,用户状态有四种:
=>未激活;1=>正常;2=>禁用;3=>软删除
现在的需求是,我要按照:正常->未激活->禁用->删除;这个顺序来进行排序,同时按照注册时间降序,网上查了很多资料,国内提到这个的很少,在stackOverFlow上找到了答案!
先上解决方案:
publicfunctionindex($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','likebinary','%'.$search.'%')
->orWhere('nick_name','likebinary','%'.$search.'%')
->orWhere('phone','likebinary','%'.$search.'%')
->orWhere('email','likebinary','%'.$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,
));
returnview('admin/customer/customerList',compact('data'));
}
打印出来的sql语句如下:
array:2[▼ =>array:3[▼ “query”=>“selectcount(*)asaggregatefromcustomerwherecustomer_type=?” “bindings”=>array:1[▼ =>“1” ] “time”=>2.08 ] =>array:3[▼ “query”=>“selectid,email,user_name,nick_name,status,phone,create_timefromcustomerwherecustomer_type=?orderbyFIELD(status,1,2,0,3,4),create_timedesclimit10offset0” “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复杂应用:
publicfunctionget_teacher_list($timeType,$name,$perPage=10,$personality=0,$teachingStyle=0,$ageType=0)
{
//\DB::enableQueryLog();
$result_data=DB::table('teacher_infoasti')
->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')+0between$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();
以上这篇Laravelfindinset排序实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。