Laravel UNION 分页查询(5.0 版本)

单个 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

猜你喜欢

转载自blog.csdn.net/molaifeng/article/details/83542024
今日推荐