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
考えられる注意事項と追加情報:
- テーブルには 39 列あります(なぜこれが問題になるのでしょうか?)
- モデルはプラグインの EXTENDED クラスです
- 新しい列の定義は 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:
さらにデバッグすると、これら 2 つの結果の間に矛盾があることがわかります。
$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