使用临时表的Cakephp分页

时间:2011-11-17 12:24:50

标签: php cakephp

我使用cakephp $this->Model->query()创建了一个临时表,并使用相同的$this->Model->query()插入了一些记录。我想分页临时表。我按如下方式加载了临时模型。

App::import('Model', $tmpModel);
$this->loadModel($tmpModel);

参考网址: Create temporary table in CakePHP and load it as a Model

不幸的是,分页没有发生,我收到了以下错误。

找不到型号“型号名称”的数据库表“表名”。虽然表名和模型名是按照cakephp惯例编写的。

可能的解决办法是什么。

3 个答案:

答案 0 :(得分:1)

我几乎可以肯定你无法使用临时表来做到这一点。这是因为Cake的底层架构缓存使用MySql的' SHOW TABLES ',返回临时表 - 因此您将始终获得“数据库表未找到型号“型号名称”的“表名”“

因此,我的建议是创建一个标准表,然后在完成后删除它。以下是可以从“用户”控制器调用的示例:

// Define temporary model
$tempModel = 'TempUser';

// Create table
$this->User->query("CREATE TABLE IF NOT EXISTS `". Inflector::tableize($tempModel)  ."` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL DEFAULT '',
  `email` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;");

// load the model
$this->loadModel($tempModel);

/**
 * Prevent caching of database schema and then get
 * the latest schema that includes our new table
 */
$this->$tempModel->cacheSources = false;
$this->$tempModel->schema();

// Save
$this->$tempModel->save(array(
  $tempModel => array(
    'name' => 'Testing',
    'email' => 'joe.bloggs@google.co.uk'
  )
));

// Paginate
$data = $this->paginate($tempModel);

// Drop Table
$this->User->query("DROP TABLE `". Inflector::tableize($tempModel)  ."`");

答案 1 :(得分:0)

我在创建tmp模型后用su来插入记录。

这里的问题是缓存,尝试删除缓存,它可能会起作用。

要阻止蛋糕缓存您的查询,您可以使用cacheQueries = false;我没有尝试过这最后一件事,但你缓存是问题,因为它缓存当前架构(没有临时表),然后当它确实存在时它找不到它,因为它使用缓存:S

答案 2 :(得分:0)

可能有分页工作,'秘密'是为临时表创建一个模型并覆盖模型中的'setSource'函数,以便不根据缓存的表列表检查表名(它创建的很多更早)。

请在此处查看我的回答以及更多详情:CakePHP can't find table after creating a table

非常感谢任何发布http://web2.0goodies.com/blog/uncategorized/mysql-temporary-tables-and-cakephp-1-3/的人提供的线索。

请注意,此方法也适用于即时创建的非临时表。