CakePHPのupdateAllが出来ない時に出るエラーDatabase Error Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column の対処法
ここが参考になります。 というか、このままですが。
ここはハマる人が多そうなポイントなので改めて書いておきます。
一言でいうならば、 リテラル(文字や変数など)を
'"'.リテラル.'"'
こういうふうに囲まないと、updateAllでは文字列を認識してくれない、ということです。
以下、詳細です。
CakePHP2.x系で、updateAllができない場合があります。
SQLクエリはほとんど合っているのに、 データベースエラーになってしまう。 更新したいカラムの指定がなぜか入力データになっている。
Database Error Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column '入力したデータ' in 'field list' SQL Query: UPDATE `データベース名`.`更新したいテーブル名` AS .....
こういうような感じです。
これの原因は、
$this->モデル名->updateAll( array( 'モデル名.name' => $insert['モデル名']['name'], ), array( 'モデル名.id' => $id, ) );
としてupdate処理を入れたい場合の
$insert['モデル名']['name'],
この部分を
'"'.$insert['モデル名']['name'].'"',
このように変えないといけません。 つまり、文字を入れる場合はクオート処理を手動でしてあげないといけないのです。
これは、CookBookにも書いてあります。すごくさり気なく…
データを保存する — CakePHP Cookbook 2.x ドキュメント
そして、エスケープ処理も入れたい場合は
'"'.Sanitize::escape($insert['モデル名']['name']).'"',
このようにしましょう。
escapeを使う場合は コントローラーの先頭で
App::uses('AppController', 'Controller'); App::uses('Sanitize', 'Utility');
このように宣言するのを忘れないようにしましょう。