6

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

4

3 回答 3

8

app/tmp/cache每当您更新生产中的应用程序(调试设置为 0)时,您都必须清除所有缓存文件(但不是目录)。

在此问题中导致问题的实际缓存是app/tmp/cache/persistent/_cake_core_method_cache. 不要让执着的部分欺骗你,就像我一样。

有关更多详细信息,请参阅这个很好的答案

于 2013-10-08T00:28:15.193 回答
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 分钟。最后,我的模型没问题并重新加载。后来我回到最初的持续时间。它很耐用,但看起来 CakePHP 的缓存有点混乱。

希望它可以帮助

于 2014-05-19T14:38:22.623 回答
0

这可能与数据库缓存引擎有关:在这种情况下,您只需更改查询即可解决您的问题(例如,使用“字段”语句删除字段)。您甚至可以尝试删除 CakePHP 的模型缓存:它位于 app/tmp/cache/models 中。

快乐编码!

于 2013-10-07T22:57:53.150 回答