我在MySQLproduction服务器上的MyISAM表中添加了new_column
。
我已从/ app / tmp / models文件夹中删除了相应的模型缓存文件。
重新加载页面并检查后,新生成的模型缓存文件包含新列。
使用fields =>读取新列不会出现在SQL查询中或结果空。
debug($this->read(null, $id));
//Query generates fields: SELECT Model.column_a, Model.column_b, Model.id WHERE ...
//Results do not include the new column
debug($this->read(array('new_column'), $id));
//Query generates fields: SELECT Model.new_column, Model.id WHERE ...
//Results include the new column and id
可能的警告和其他信息:
如何让模型识别新表定义?我应该调查其他缓存系统吗?
编辑#1:
debug($this->ModelName->getDataSource()->describe('table_name'));
// outputs all columns
// ...
'new_column' => array(
'type' => 'text',
'null' => true,
'default' => null,
'length' => null,
'collate' => 'utf8_general_ci',
'charset' => 'utf8'
)
编辑#2:
我试过完全禁用缓存。虽然该模型选择了新列,但它并不是真正的解决方案。
Configure::write('Cache.disable', true);
// new_column appears in both query and results
编辑#3:
进一步调试表明这两个结果之间存在差异:
$this->ModelName->getDataSource()->fields($this->Model, 'ModelName');
//returns fields without new_colum
array_keys($this->ModelName->schema());
//returns fields with new_column
这暂时解决了这个问题:
$ds = $this->ModelName->getDataSource();
$ds->cacheMethods = false;
...
DboSource的方法缓存是此问题的根源。慢慢走到最底层......:D
答案 0 :(得分:6)
每当更新正在生产的应用程序(debug设置为0)时,您必须清除app/tmp/cache
中的所有缓存文件(但不清除目录)。
导致此问题出现问题的实际缓存是app/tmp/cache/persistent/_cake_core_method_cache
。不要让持久性部分欺骗你,就像我一样。
有关详细信息,请参阅this great answer。
答案 1 :(得分:0)
这可能与数据库缓存引擎有关:在这种情况下,您只需更改查询即可解决问题(例如,使用'fields'语句删除字段)。您甚至可以尝试删除CakePHP的模型缓存:它位于app / tmp / cache / models中。
快乐的编码!
答案 2 :(得分:0)
实际上,如果使用插件,可以添加引导程序文件。 在我的全局引导文件中,我把:
CakePlugin::load('Myplugin', array('routes' => true, 'bootstrap' => true));
并在Plugin / Myplugin / Config / bootstrap.php中我有
<?php
Cache::config('_cake_core_', array(
'engine' => 'File',
'prefix' => 'cake_core_myplugin_',
'path' => CACHE . 'persistent' . DS,
'serialize' => true,
'duration' => '+7 days',
));
?>
我在我的一个模型中添加了两列,我遇到了同样的问题。然后我删除了所有模型和持久缓存文件和我将自举文件中的持续时间更改为1分钟。 最后,我的模型还可以重新加载。后来我回到最初的持续时间。 这是durty,但它看起来像CakePHP搞砸了一点缓存。
希望它可以提供帮助