单个 UNION
查询时,很简单,只需两个条件联合起来
$query = DB::connection()->table('user')->limit(100);
$query = $query->union(DB::connection()->table('user')->limit(100));
但是如果是循环中呢,一不小心就会写成 UNION
相互嵌套的情况,下面给出示例,并带上分页的效果,因为官方文档中没有相关实现
function cond($query)
{
return $query->limit(100);
}
$query = null;
for ($i=0; $i<5; $i++) {
if ($query == null) {
$query = DB::connection()->table('user')->limit(100);
}
$subQuery = cond(DB::connection()->table('user'));
$query = $query->union($subQuery);
}
$data = $query->get();
$page = 1;
$paginate = 10;
$offSet = ($page * $paginate) - $paginate;
$itemsForCurrentPage = array_slice($data, $offSet, $paginate, true);
$list = new \Illuminate\Pagination\LengthAwarePaginator\LengthAwarePaginator($itemsForCurrentPage, count($data), $paginate, $page);
sql
如下
(select * from `user` limit 100) union (select * from `user` limit 100) union (select * from `user` limit 100) union (select * from `user` limit 100) union (select * from `user` limit 100) union (select * from `user` limit 100)
这个实现方法有个缺点,那就是会把所有数据取出来再手动分页,如果数据量大的话会有性能问题,到那时就得手动拼 sql
实现了。
参考文档
[1] https://github.com/laravel/framework/issues/2968
[2] https://itsolutionstuff.com/post/how-to-add-pagination-with-union-in-laravel-4-and-laravel-5