0

我直接通过查询创建表。我只想导入一些数据。因此,我执行一个动态构建的查询,并尝试在组件类中执行此查询。(我使用一个随机的现有模型来执行这个查询是否有更好的原因?)

$query= "CREATE TABLE IF NOT EXISTS testerdbs (
'Ü1' varchar(6) COLLATE utf8_swedish_ci DEFAULT NULL,
'Ü2' varchar(6) COLLATE utf8_swedish_ci DEFAULT NULL,
'Ü3' int(3) DEFAULT NULL,
'Ü4' varchar(6) COLLATE utf8_swedish_ci DEFAULT NULL,
'Ü5' date DEFAULT NULL
)"
$data = ClassRegistry::init('import_files');
$data->query($query);

这工作正常。在同一个请求中,我想访问控制器中创建的表。

App::import('Model', "testerdb");
//$this->loadModel("testerdb");
$newTable = ClassRegistry::init("testerdb");
echo '<pre>', print_r($newTable->getColumnTypes()), '</pre>';

如果我尝试在同一请求中执行此操作,我总是会收到错误消息:

错误:在数据源默认值中找不到模型 testerdb 的表 testerdbs。

如果我再次执行完全相同的请求,一切正常......我谷歌了大约一个小时,似乎蛋糕缓存了模型。如果我再次执行此请求,蛋糕再次缓存所有表格,然后蛋糕找到我的新表格。所以我希望在同一个请求中加载或导入创建的表,但我不工作。

还有另一种加载表格的方法吗?我的错误在哪里?

感谢帮助!

4

2 回答 2

1

这可能有点陈旧,但我上周才试图解决这个问题,也许这会对某人有所帮助。

根本问题是表名的缓存是在你创建临时表之前初始化的,所以'setSource'函数返回一个临时表不存在的错误。

解决方案是覆盖您为“testerdb”创建的模型的“setSource”函数并删除对表存在的检查(即测试中的所有内容:

if (method_exists($db, 'listSources'))' )

您的模型定义应如下所示:

App::uses('AppModel', 'Model');
class testerdb extends AppModel {
public function setSource($tableName) {
    $this->setDataSource($this->useDbConfig);
    $db = ConnectionManager::getDataSource($this->useDbConfig);
    $this->table = $this->useTable = $tableName;
    $this->tableToModel[$this->table] = $this->alias;
    $this->schema();  
    }
}

非常感谢发布下面链接的人。这适用于我的 CakePHP 2.0 实例。 http://web2.0goodies.com/blog/uncategorized/mysql-temporary-tables-and-cakephp-1-3/

于 2014-09-23T02:56:13.410 回答
0

为什么你只想有一个临时表?我只是将您要导入的任何数据暂时存储在内存模型或数据结构中。

如果表不是临时的,那么只需在运行程序之前静态创建它。

于 2013-09-26T18:21:09.460 回答