Fork me on GitHub

永不止步

两种含分页和排序的不同表联合查询

当你要把几个表的数据合并到一个列表页里展示怎么办?

(以下是yii框架的方法)

1.当表的数据结构相同的时候,用union。

1         $query1  = Table1::find();
2         $query2  = Table2::find();
3         $queryAll = $query1->union($query2);
4         $query = Table1::find()->from(['c' =>$queryAll])->orderBy('c.id desc');
5 
6         $active = new ActiveDataProvider([
7             'query' => $query,
8         ]);    

2.当表的数据结构不同的时候,用比较笨的方法——用redis记录页码和时间。

        $redis = new Redis();
        $page = [1,time(),time(),0];   //用户保存分页的数组 [1]表1当前页最后一条时间[2]表2当前页最后一条时间[3]记录总条数
        if($page_num != 1){
            $page = json_decode($redis->get($key),true);
        }
        //表1取前10
        $dataProvider1 = new ActiveDataProvider([
            'query' => $query1
        ]);
        $list1 = $dataProvider1->top($limit)->toArray();
        //表2前10
        $dataProvider2 = new ActiveDataProvider([
            'query' => $query2
        ]);

        $list2 = $dataProvider2->top($limit)->toArray();
        //合并后排序再取前10
        $arrActive = array_merge($list1,$list2);
        $sort = array_column($arrActive,'created_at');
        array_multisort($sort, SORT_DESC,$arrActive);
        foreach($arrActive as $k=>$item){
            if($k<$limit){
                $list[] = $item;
                $page[$item['type']] = $item['created_at']; //两个表中有区分的字段,表1的type=1,表2type=2
            }
        }
        //计算总量
        $count = $dataProvider1->query->count()+$dataProvider2->query->count();
        if($page_num==1){
            $page[3] = $count;
        }
        //分页数据缓存
        $redis->set($key, json_encode($page));
        $redis->expireAt($key, RedisKey::EXPIRE_TIME_DAY);

        $result['total_page']   = ceil($page[3]/$limit);
        $result['current_page'] = $page_num;
        $result['page_size']    = $limit;
        $result['total_count']  = $page[3];
        $result['list'] = $list;                        

 

posted @ 2021-03-05 19:04  Magiko  阅读(212)  评论(0)    收藏  举报
未知歌曲
00:00
00:00

回忆录

关闭