我new_column
在 MySQL 生产服务器上的 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
可能的警告和附加信息:
- 该表有 39 列(为什么会出现问题?)
- 该模型是插件的扩展类
- 新列定义为 TEXT DEFAULT null
- 以前对表格的更新给出了预期的结果
- 应用的本地开发副本没有这个问题
- 测试控制器操作启用 Configure::write(debug => 2)
- CakePHP 2.3.6、PHP 5.4.19、MySQL 5.1.70
如何让模型识别新的表定义?还有其他我应该调查的缓存系统吗?
编辑#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