laravel select 中不存在的内容用符号代替
MySql中汉字排序
laravel select 中不存在的内容用符号代替
$query = DB::table('WorkOrder')
->join('Member', 'WorkOrder.applier', '=', 'Member.id')
->select(DB::raw('WorkOrder.*,Member.fullName,Member.username,"-" as amount ,"-" as cardholder'))
->paginate(10);
select 中不存在的内容用符号代替,如查询中用-表示字段Amount的内容。
非特殊情况不建议使用,如果是在前端模版中有这个字段的时候,可以判断是否存在这个字段,存在的话就显示:
<?php echo isset($item->amount)? $item->amount : ‘—‘; ?>
MySql中汉字排序
我的MySQL数据库字符集用的UTF-8,此为环境。
做项目时需要用到对查出来的数据按首字母排序,事实上也就是对汉字的拼音按照a—z的顺序进行升序降序排列。
本以为是简单的order by XXX asc/desc,哪知道最后结果并没有按照想象中的排序。
使用utf-8字符集时,汉字排序并不是按照字母顺序的。
解决方式有两个:
1.修改数据库字符集,把utf-8改为gbk。
2.修改sql语句:把select from user order by name desc 改为 select from user order by convert(name using gbk) desc
这样排序的字段就按照字母顺序排列了。
laravle中写法:
在方法后面加Raw就可以写原生的SQL语句
<?php
$query = DB::table('TestDrive')
->leftJoin('Member', 'TestDrive.memberId', '=', 'Member.id')
->select('TestDrive.*', 'Member.fullName', 'Member.username');
//重复试驾人姓名(某一个重复的姓名全部处理过的重复记录不显示,只显示没有处理过的重复记录和有新增重复的话,需要把之前处理过的记录也显示出来。
//所以过滤的时候只需要过滤重复姓名中全部处理过的记录。所以不能一开始就使用where repeatName=0,需要在分组之后,如果分组的结果中,重复的人都处理过了就不显示。
//分组之后count(name)某一个姓名重复的次数。repeatName是已处理的为1,未处理为0,如果这个重复姓名都处理过了,那么sum(repeatName)应该等于count(name),所以只需要在分组中显示sum(repeatName)小于当前名字重复次数的记录。说明还有重复的人没有处理。
//如果不用这种方法,或者处理完成的状态是字符串,就得遍历所有的结果集,使用group_concat(state)将字符串状态也显示出来。遍历的时候分割字符串,如果字符串的数量少于count(name)的数量,那就说明还有未完成的重复记录,需要展示出来。
$repeatName = DB::table('TestDrive')
//->where('repeatName',0)
->groupBy('name')
->havingRaw('count(name) > 1 AND sum(repeatName)<count(name)')
->lists('name');
$query = $query->whereIn('name',$repeatName)
->OrderByRaw('convert(name using gbk) asc')
->OrderBy('id','desc')
->paginate(10);
return $query;
按年月日统计
<?php
// 年
if($model->month==00){
$now = strtotime($model->year.'-01-01 00:00:00');
$next = strtotime($model->year+'1'.'-01-01 00:00:00');
$mysqlDate = 'month';
//月
}else{
$now = strtotime($model->year.'-'.$model->month.'-01 00:00:00');
// 如果查的是2015-12月,将查找到2016-01月之间的数据。否则与当前月份+1进行比较
if($model->month==12){
$next = strtotime($model->year+'1'.'-01-01 00:00:00');
}else{
$next = strtotime($model->year.'-'.($model->month+1).'-01 00:00:00');
}
$mysqlDate = 'day';
}
//试驾人数
$query = DB::table('TestDrive')
->whereRaw("unix_timestamp(created_at)>$now AND unix_timestamp(created_at)<$next")
//两种方式都可以,一个是显示月份或者天数,另一个是格式化日期,可显示的日期类型更加强大。
->select(DB::raw('count(*) as driveCount'),DB::raw("$mysqlDate(created_at) as diveTimes"))
//->select(DB::raw('count(*) as driveCount'),DB::raw("DATE_FORMAT(created_at,'%Y-%m-%d') as diveTimes"))
->groupBy('diveTimes')
->get();
<!-- 按日查询 -->
SELECT DATE_FORMAT(created_date,'%Y-%m-%d') as time,sum(money) money FROM o_finance_detail where org_id = 1000 GROUP BY time
<!-- 按月查询 -->
SELECT DATE_FORMAT(created_date,'%Y-%m') as time,sum(money) money FROM o_finance_detail where org_id = 1000 GROUP BY time
<!-- 按年查询 -->
SELECT DATE_FORMAT(created_date,'%Y') as time,sum(money) money FROM o_finance_detail where org_id = 1000 GROUP BY time
<!-- 按周查询 -->
SELECT DATE_FORMAT(created_date,'%Y-%u') as time,sum(money) money FROM o_finance_detail where org_id = 1000 GROUP BY time