目标
使用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();
然而,所有这一切都是对用户模型进行分页,而不是我的观点。所以我似乎错过了某个关键步骤。
任何帮助都将不胜感激。
答案 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
模型进行分页。