使用CRUD插件的CakePHP分页数据库视图

时间:2016-08-03 14:46:39

标签: cakephp pagination crud

目标

使用Cake2.x和CRUD插件我需要查询和分页两个不同的模型

方法

我在模型文件中编写了一个数据库视图,它在我希望组合和分页的两个模型上执行Union:

App::uses('ConnectionManager', 'Model');
App::uses('AppModel', 'Model');
App::uses('CakeLog', 'Log');

class Search extends AppModel {

    public function __construct() {
        parent::__construct();

        $connection = ConnectionManager::getDataSource('default');
        $return = $connection->execute("CREATE OR REPLACE VIEW `search` AS
            SELECT Post.id, 'post' AS `type` FROM `posts` AS `Post` 
            UNION 
            SELECT Product.id, 'product' AS `type`  FROM `products` AS `Product`");

        $return = ($return == true)?'Search View created successfully on '.date('Y-m-d H:i:s'):$return;
        CakeLog::write('search', $return);
    }

    public $useTable = 'search';// This model does not use a database table
    public $primaryKey = 'id'; // Define primary key
    public $useDbConfig = 'default'; // Define db

问题

我似乎无法对数据库视图进行分页,这就是我在用户控制器中所做的事情:

$this->loadModel('Search'); // executes the database view SQL
return $this->Crud->execute();

然而,所有这一切都是对用户模型进行分页,而不是我的观点。所以我似乎错过了某个关键步骤。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:2)

  

这就是我在用户控制器中所做的事情:

$this->loadModel('Search'); // executes the database view SQL

调用loadModel不会修改Crud将要使用的表 - 它只会使模型Search在控制器操作中可用。

更改modelClass属性

Crud Index操作仅调用paginate - 默认情况下,在用户控制器中,它将对User模型进行分页。要对另一个表进行分页 - 最简单的方法是将modelClass property设置为该模型名称:

$this->modelClass = 'Search';
$this->Crud->execute();
然后

Crud应该对Search模型进行分页。