如何通过复杂的查询有效地实现分页

时间:2014-03-15 18:26:07

标签: php pagination

我正在尝试提出一种方法来有效地为以下数据/查询创建分页。

问题:

  1. 我将销售存储在关联数组$data['summary'][$SALE_ID]和$ data ['详细信息'] [$ SALE_ID]`中。我需要保持秩序。我不确定php关联数组是否保持顺序。

  2. 我想要一个简单的方法,例如array_slice来获取我需要显示的数据集。我无法弄清楚如何做到这一点。我试过

  3. $data['summary'] = array_slice($data['summary'], $offset, $limit, TRUE),但我不确定这是否是最好的方法

    public function getData()
    {
        $data = array();
        $data['summary'] = array();
        $data['details'] = array();
        $offset = $this->params['offset'];
                $limit = $this->params['limit'];
    
        //Returns 1 row for each item per sale. This means if the sale has 2 items, there will be two results per sale
    
        $sales_items_rows = $this->get_all_sale_items();
    
        foreach($sales_items_rows as $sale_item_row)
        {
            if (!isset($data['summary'][$sale_item_row['sale_id']]))
            {
                $data['summary'][$sale_item_row['sale_id']] = array(
                    'sale_id' => $sale_item_row['sale_id'],
                    'sale_time' => $sale_item_row['sale_time'],
                    'sale_date' => $sale_item_row['sale_date'],
                    'employee_name' => $sale_item_row['employee_name'],
                    'customer_id' => $sale_item_row['customer_id'],
                    'customer_name' => $sale_item_row['customer_name'],
                    'payment_type'=> $sale_item_row['payment_type'],
                    'comment'=> $sale_item_row['comment'],
                    'items_purchased' => 0,
                    'subtotal' => 0,
                    'total' => 0,
                    'tax' => 0,
                    'profit' => 0,
                );
            }
    
            $data['summary'][$sale_item_row['sale_id']]['items_purchased']+=$sale_item_row['quantity_purchased'];
            $data['summary'][$sale_item_row['sale_id']]['subtotal']+=$sale_item_row['subtotal'];
            $data['summary'][$sale_item_row['sale_id']]['total']+=$sale_item_row['total'];
            $data['summary'][$sale_item_row['sale_id']]['tax']+=$sale_item_row['tax'];
            $data['summary'][$sale_item_row['sale_id']]['profit']+=$sale_item_row['profit'];
    
            $data['details'][$sale_item_row['sale_id']][] = $sale_item_row;
        }
    
    $data['summary'] = array_slice($data['summary'], $offset, $limit, TRUE)
    $data['details'] = array_slice($data['details'], $offset, $limit, TRUE)
    
        return $data;
        }
    

1 个答案:

答案 0 :(得分:1)

首先:从数据库中获取所有项目,处理所有项目,然后只抓取一个子集,对于数据库和php本身都是非常低效的。考虑限制(使用偏移量)从数据库返回的结果集!!

如果由于某种原因真的不可能,是的,你可以使用一个阵列。由于数组被定义为有序映射,因此无论您对数组执行什么操作,都将保持顺序。当然,有很多功能可以改变顺序(例如所有的排序函数),但通常你可以相信数组的顺序与你创建它的顺序相同。

但还有另一种选择:为什么不让php自己创建索引?截至目前,您将相关行存储为ID作为索引,但您也可以将ID存储为值,并使用' auto-incremental'指数。这几乎就是数据库实际返回数据的方式......

所以而不是:

$data['summary'][$sale_item_row['sale_id']] = array(
    'items_purchased' => $sale_item_row['quantity_purchased'],
     ...
);

你会这样做:

$data['summary'][] = array(
    'sale_id'         => $sale_item_row['sale_id'],
    'items_purchased' => $sale_item_row['quantity_purchased'],
     ...
);

现在您拥有一张完美有序的地图,其中包含递增的索引,并且销售ID为“'属性”。你的行。