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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值