Van*_* D. 5 mysql caching cakephp model
我new_column在MySQLproduction服务器上添加了一个MyISAM表.
我从/ app/tmp/models文件夹中删除了相应的模型缓存文件.
重新加载页面并检查后,新生成的模型缓存文件包含新列.
使用fields => null读取时,新列不会出现在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
Run Code Online (Sandbox Code Playgroud)
可能的警告和其他信息:
如何使模型识别新表定义?我应该调查其他缓存系统吗?
编辑#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'
)
Run Code Online (Sandbox Code Playgroud)
编辑#2:
我试过完全禁用缓存.虽然该模型选择了新列,但它并不是真正的解决方案.
Configure::write('Cache.disable', true);
// new_column appears in both query and results
Run Code Online (Sandbox Code Playgroud)
编辑#3:
进一步调试表明这两个结果之间存在差异:
$this->ModelName->getDataSource()->fields($this->Model, 'ModelName');
//returns fields without new_colum
array_keys($this->ModelName->schema());
//returns fields with new_column
Run Code Online (Sandbox Code Playgroud)
这暂时解决了这个问题:
$ds = $this->ModelName->getDataSource();
$ds->cacheMethods = false;
...
Run Code Online (Sandbox Code Playgroud)
DboSource的方法缓存是此问题的根源.慢慢走到最底层......:D
这可能与数据库缓存引擎有关:在这种情况下,您只需更改查询即可解决问题(例如,使用“fields”语句删除字段)。您甚至可以尝试删除 CakePHP 的模型缓存:它位于 app/tmp/cache/models 中。
快乐编码!
| 归档时间: |
|
| 查看次数: |
2326 次 |
| 最近记录: |