2013-09-26 50 views
0

我直接通过查询创建表。我只想导入一些数据。因此,我执行一个动态构建的查询,并尝试在Component-class中执行此查询。 (我用随机存在的模型来执行这个查询有没有更好的理由?)创建表后,CakePHP无法找到表

$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>'; 

如果我试图在同样的要求来执行此我总是得到错误:

Error: Table testerdbs for model testerdb was not found in datasource default.

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

是否有另一种方法来加载表?我的错误在哪里?

感谢您的帮助!

+0

请阅读cakephp的命名约定http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#hasandbelongstomany-habtm – Aryan

回答

0

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

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

+0

我导入不同的CSV文件。文件的结构定义了表的结构......所以它总是不同的,为什么我无法静态地创建模型。但也许临时是不正确的表达,我只需要这张桌子几天^^ –

1

这可能有点陈旧,但我只是在上周试图解决问题,也许这会帮助某人。

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

的解决方案是overrid为您创造“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/