两种含分页和排序的不同表联合查询
当你要把几个表的数据合并到一个列表页里展示怎么办?
(以下是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;

浙公网安备 33010602011771号