CakePHP分页不适用于自定义查询

时间:2014-09-25 15:27:59

标签: cakephp pagination

我在CakePHP中有一个查询,它以某种方式连接其他表来获得我想要的结果。

$options = array();
    $options['fields'] = array('Order.*', 'OrderCustomer.*', 'Payment.*','OrderCoupon.*', 'OrderSalesrep.*', 'OrderPackage.*');
    $options['order'] = "Order.added DESC";

    $options['joins'] = array(
                            array(
                                'table'=>'ordercustomers',
                                'alias'=>'OrderCustomer',
                                'type'=>'inner',
                                'conditions'=>array('OrderCustomer.order_id=Order.id')
                            ),
                            array(
                                'table'=>'payments',
                                'alias'=>'Payment',
                                'type'=>'inner',
                                'conditions'=>array('Payment.id=Order.payment_id')
                            ),
                            array(
                                'table'=>'ordercoupons',
                                'alias'=>'OrderCoupon',
                                'type'=>'left',
                                'conditions'=>array('OrderCoupon.order_id=Order.id')
                            ),
                            array(
                                'table'=>'ordersalesreps',
                                'alias'=>'OrderSalesrep',
                                'type'=>'left',
                                'conditions'=>array('OrderSalesrep.order_id=Order.id')
                            ),
                            array(
                                'table'=>'orderpackages',
                                'alias'=>'OrderPackage',
                                'type'=>'left',
                                'conditions'=>array('OrderPackage.order_id=Order.id')
                            )
    );

$orders = $this->Order->find('all', $options);
    $pageSettings = array();
    $pageSettings['limit'] = 20;
    $pageSettings['order'] = array('Order.added'=>'desc');
    $this->Paginator->settings = $pageSettings;
    $this->set('orders', $this->Paginator->paginate());

然后我想在我看来将它分页。不知怎的,它不起作用。但是我确实尝试只使用这些行$orders = $this->Order->find('all', $options);$this->set('orders', $this->Paginator->paginate());并且它有效。分页是否仅适用于对模型的直接查询,或者它也适用于像上面的查询一样的查询,这些查询会加入其他表。感谢。

1 个答案:

答案 0 :(得分:1)

(不知道你的cakephp版本,假设是2.x)

你很困惑。你找不到东西,然后分页。 paginator组件对它自己进行整个查询。所以你所做的基本上是

  1. 这里,cakephp,找到我这个复杂的查询
  2. 得到它,非常感谢,现在将这个完全不相关的查询打包给我
  3. 嘿,等等,那是行不通的
  4. 因此,不要将简单的查找用于要分页的查询,同样,不要使用Paginator进行简单的查找以查找其他内容(不是说你现在正在做,只是友好的提醒)。

    对于手头的问题cakephp docs有例子。这个例如

    $this->Paginator->settings = array(
        'conditions' => array('Recipe.title LIKE' => 'a%'),
        'limit' => 10
    );
    $data = $this->Paginator->paginate('Recipe');
    $this->set(compact('data'));
    

    因此,将其更改为您的问题就像是

    //the same options array
    //$pageSettings = array();
    $options['limit'] = 20; //this is by default, I think, so you can omit it
    $options['order'] = array('Order.added'=>'desc');
    $this->Paginator->settings = $options;
    $this->set('orders', $this->Paginator->paginate());
    

    你完成了。如果有错误,您可以逐个处理(如果您没有在线找到解决方案,请在此处询问)。

    这是Paginator API,如果这有助于您清除对所需功能和参数的疑虑。