遇到查多张分表还需分页的操作思路

52 篇文章 0 订阅
34 篇文章 0 订阅

1、使用缓存分别获取两张表的数据,然后采用数组分页的方式

$list = Cache::getOrSet("wx_mini_user_reward_exchange_log_" . $preTime . '_' . $map['region'] . '_' . $type, function () use ($preTime, $filter) {
            return $list = $this->UserRewardLog()->setTableName($preTime, false)->setDb($this->db)->where($filter)
                ->field('*')->order('use_time desc')->select();

        }, $this->duration, true);

        if($time != $preTime){
            $list1 = Cache::getOrSet("wx_mini_user_reward_exchange_log_" . $time . '_' . $map['region'] . '_' . $type, function () use ($time, $filter) {
                return $list1 = $this->UserRewardLog()->setTableName($time, false)->setDb($this->db)->where($filter)
                    ->field('*')->order('use_time desc')->select();

            }, $this->duration, true);

            $list = array_merge($list, $list1);
        }


        //翻页
        $page['totalCount'] = count($list);//总条数
        $pageSize           = $export == 1 ? count($list) : $pageSize;
        $page['totalPage']  = ceil($page['totalCount'] / $pageSize);//总页数
        $offset             = ($currentPage - 1) * $pageSize;
        $page['list']       = array_slice($list, $offset, $pageSize) ?: [];
        foreach ($page['list'] as $key => &$item) {
            if (!is_array($item))
                $item = $item->toArray();
            $number                           = $item['prop_type'] == 101 ? $item['number'] / 100 : (int)$item['number'];

            $page['list'][$key]['give_time']  = $item['get_time'] ? date('Y-m-d H:i:s', $item['get_time']) : '';
            $page['list'][$key]['use_time']   = $item['use_time'] ? date('Y-m-d H:i:s', $item['use_time']) : '';
         
            $page['list'][$key]['price']      = $number . $item['unit'];
            $page['list'][$key]['prop_name']  = $item['prop_name'] . "(" . $item['prop_id'] . ")";
            $page['list'][$key]['state_name'] = $item['prop_type'] == 102 ? $this->master[$item['reward_state']] : $this->state[$item['reward_state']];

        }

        return $page;

2、使用子查询

if($time != $preTime){

            $preSql = $this->UserRewardLog()->setTableName($time, false)->setDb($this->db)->where($filter)->fetchSql(true)
                ->field('*')->order('use_time desc')->select();
            $sql = $this->UserRewardLog()->setTableName($time, false)->setDb($this->db)->where($filter)->field('COUNT(1) AS totalCount')->fetchSql(true)->select();
            $totalCount = $this->UserRewardLog()->setTableName($preTime, false)->setDb($this->db)->where($filter)->field('COUNT(1) AS totalCount')
                ->union($sql,true)->select();
            $count = 0;
            foreach ($totalCount as $c){
                $count += $c->totalCount;
            }
            $list['totalCount'] = $count;

            $pageSize           = $export == 1 ? $list['totalCount'] : $pageSize;
            $list['list'] = $this->UserRewardLog()->setTableName($preTime, false)->setDb($this->db)->where($filter)->page($currentPage,$pageSize)->union($preSql,true)
                ->field('*')->order('use_time desc')->select();

        }else{
            $list['totalCount'] = $this->UserRewardLog()->setTableName($preTime, false)->setDb($this->db)->where($filter)->count();
            $pageSize           = $export == 1 ? $list['totalCount'] : $pageSize;
            $list['list'] = $this->UserRewardLog()->setTableName($preTime, false)->setDb($this->db)
                ->where($filter)->page($currentPage,$pageSize)
                ->field('*')->order('use_time desc')->select();
        }

注:本人使用tp5框架操作,设置表名方法已封装过

获取表名的封装方法:

    /**
     * 获取表名
     * @param $name
     * @param bool $needHash
     * @return $this
     */
    public function setTableName($name, $needHash = true)
    {
        $this->table = $this->preTable . '_' . $this->getTableSub($name, $needHash);
        $this->setTable($this->table);
        return $this;
    }

    public function getTableSub($name, $needHash = true)
    {
        if ($this->partDebug) return 0;
        if (!$needHash) return $name;
        return hexdec(substr(md5($name), 4, 1)) & ($this->partMaxNum - 1);
    }
    /**
     * 指定默认数据表名(含前缀)
     * @access public
     * @param string $table 表名
     * @return $this
     */
    public function setTable($table)
    {
        $this->table = $table;
        return $this;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值