在 CakePHP 2 中,您如何告诉分页器组件使用哪个模型?

In CakePHP 2, how do you tell the Paginator component which model to use?

给定以下工作示例,

// ProductsController.php
<?php
App::uses('AppController', 'Controller');

class ProductsController extends AppController {
    public $helpers = array('Html', 'Form');

    public $components = array('Session', 'Paginator');

    public $paginate = array(
        'limit' => 5
    );

    public function index() {
        $this->Product->recursive = -1;
        $this->set('products', $this->paginate());
    }
}
?>

是什么告诉 Paginator 在设置变量时使用哪个模型?目前这似乎是自动使用 Products 模型,但我不太明白为什么。选择与当前控制器同名的模型只是 CakePHP 魔法的一部分吗?如果是这样,我将如何告诉 Paginator 使用其他模型?就像如果我还想在同一页面上对用户模型进行分页,我将如何实现它?

因此,经过反复试验后,Paginator 似乎默认情况下只会使用通过命名约定与控制器关联的任何模型('User' 模型与 'UsersController'控制器等)。

$this->paginate() 的第一个参数将接受一个不同的模型,例如 $this->paginate('Dinglehopper'),但是指定的模型需要在 controller/action 中可用为了让它工作。为此,您需要在调用 $this->paginate('Dinglehopper') 的操作中使用 $this->loadModel('Dinglehopper');

因此,在您想要在 'Products' 控制器中使用和分页模型 'Dinglehopper' 的假设情况下,您会这样做,

// ProductsController.php
<?php
App::uses('AppController', 'Controller');

class ProductsController extends AppController {
    public $helpers = array('Html', 'Form');

    public $components = array('Session', 'Paginator');

    public $paginate = array(
        'limit' => 5
    );

    public function index() {
        $this->loadModel('Dinglehopper');

        $this->Product->recursive = -1;
        $this->set('dinglehoppers', $this->paginate('Dinglehopper'));
    }
}
?>

$this->loadModel('Dinglehopper'); 使模型 'Dinglehopper' 可用于操作,然后 $this->paginate('Dinglehopper') returns 分页的 Dinglehopper 模型。

根据 Cakephp2, $this->paginate() 默认适用于当前模型。

如果您想在同一页面上使用其他模型,您可以这样做:

$this->paginate('User');

您都可以传递其他参数,例如:

  $this->Paginator->settings = array(
         'fields' => array('User.*'),  
         'order'  => array('User.username' => 'asc'),
         'limit'  => 10,
     );
     $this->set('users', $this->paginate('User'));

参考:Pagination