在laravel利用联合查询时两个数据表按照某一字段排序
在项目中需要把两个表的数据按照时间进行排序,需要利用mysql的两个查询
代码:
$tourist = Tourist::query()
->select('id', 'name as customer_name', 'created_at as time', DB::raw("2 as type, 0 as status"))
->when(!empty($search), function ($query) use ($search) {
$like = '%' . $search . '%';
$query->where('name', 'like binary', $like)
->orWhere('mobile', 'like binary', $like);
})->when(empty($search), function ($query) {
$query->whereBetween('created_at', TimeHelper::today());
});
$builder = Customer::query()
->select('id', 'customer_name', 'register_time as time', DB::raw("1 as type, status"))
->where('delete_time', 0);
if ($search) {
$like = '%' . $search . '%';
$builder->where(function ($query) use ($like) {
$query->where('customer_name', 'like binary', $like)
->orWhere('mobile', 'like binary', $like)
->orWhere('email', 'like binary', $like);
});
} else {
$builder->whereBetween('register_time', TimeHelper::today());
}
$userList = $builder->union($tourist)
->orderByDesc('time')
->offset(($page - 1) * $per_page)
->limit($per_page)
->get()->toArray();
程序解释:
DB::raw("2 as type, 0 as status")
意思是:给tourist
表 和customer
表添加一个虚拟的数据type(tourist为2, customer为1)表明如果id有重复可以知道这个id对应的那个表的数据记录:
效果:
// 说明 type=2 是tourist中的记录, type=1是customer中的记录
{
"id": 55,
"customer_name": "13246532066",
"time": 1552127193,
"type": 1,
"status": 1
}, {
"id": 16,
"customer_name": "HGH",
"time": 1552095123,
"type": 2,
"status": 0,
},
在我的使用mysql 中的like 模糊查询是,不区分大小写问题
深入了解:
在MySQL中,对于Column Collate其约定的命名方法如下:
*_bin: 表示的是binary case sensitive collation,也就是说是区分大小写的
*_cs: case sensitive collation,区分大小写
*_ci: case insensitive collation,不区分大小写解决办法:
- 修改需要进行模糊查询字段的 Collate
- 在进行模糊查询的时候,在like的后面加个binary就可以了,适用于表的结构不易改变的情况下(以上例子用此办法)
若需要按照某一字段进行排序,需要确保排序的字段的名字相同的,如上例中的
time
如果两个数据表中的字段不一样可以使用as
设置别名的办法若要使用条件查询,需要在各自的
sql builder
中填写对应的条件查询语句