むか~しむかし、まあだいたい1年くらい前ですが、CakePHPで開発をしている場合の話で、「単一のモデルにおいて、複数のレコードをまとめてアップデートしたいようなときには、updateAll()を使うといい」みたいなことを、言ったことがありました。
そのときの記事がこれ
僕は開発はCakePHPに頼りっぱなしなので、いざってときに自分でSQL文を書けないプログラマとしてすくすく育ってきたものですから、当然のようにUPDATE文も書けないわけです。
でも自分で昔にこの記事を書いたってことだけは未だに覚えてるから、UPDATE文を書くときには必ずこの記事を見てたんですよ。一応、一番下にSQL文も載せときましたからね。主にphpMyAdminで直接SQL文を書くときに重宝してました。今でもしてます。
何回も書いてればそのうち見なくても書けるようになるんじゃないのかと思わないでもないんですけど、未だに覚えないんですよね~。こういうのって、ここを見れば分かるってことを覚えてると、意外と頭の中には残らないんですよね。電話番号と一緒ですよ。携帯電話を持ってなかった頃は友達の番号とかわりと記憶してましたけど、携帯を持っちゃうと、そんなのいちいち覚えてる必要がなくなるから、もう全く覚えていられない。
人間、必要がなくなると衰える一方ですわね。
逆に開発していてupdateAllを使うことって今までほとんどなかったんですけど、今日、ついにその日が来ましてね。同じように上記のリンク先に行って自分の記事を見ながら書けば問題ないと喜び勇んでいたのですが……
あの記事、間違ってましたorz
まあ、前にも同じ会社の先輩プログラマのヅヤ氏に「これ間違ってね?」って指摘されたことがあったんですけど、「ああ、じゃあ後で記事直しとくよ」とか適当にあしらって終わってしまったので、未だに間違えたまま記事として公開されてるんですが、今日はこいつのせいで俺自身が要でもないエラーに悩まされていたので、今ここで改めて正しい内容を書いとこうと思います。
万が一、他にもあの記事を見て同じように動かねえじゃねーかって人が出てしまったときのために、間違いは早めに訂正しておかないとね。早めにっつっても、もう1年以上経ってますけど。
あと土下座する準備もしておくから、いつでもゲザれるぜ。
間違っている箇所が分かり易いように、たとえは前回と同じでいきましょう。usersというテーブルにageとseijinという二つのフィールドがあるとし、どちらもint型で、ageには年齢が、seijinには、1か0の値が入っている。成人だったら1、そうでなければ0。そして今、20歳以上の人のseijinフィールドの値を全て1にしたいとする。
前回の内容はこちら。
$fields = array('age >= ' => '20');
$conditions = array('seijin' => '1');
$this->User->updateAll($fields, $conditions);
正しくはこちら。
$fields = array('seijin ' => '1');
$conditions = array('age >=' => '20');
$this->User->updateAll($fields, $conditions);
ようするに、fieldsとconditionsの中身が逆だったってことですね。まあ、フィールドって何ぞやとかコンディションって何ぞやってことをちゃんと分かってる人なら、この間違いにもすぐ気付くし、正しくはどう書くのかもすぐに分かると思うんですけどね。自分自身の備忘録の意味もあるので、ちゃんと書いときます。
これで大丈夫だね。俺も今度からはこっちの記事を見るようにするよ。
あ、ついでにUPDATE文も載せときましょうか。あっちは間違ってないので、前回と全く一緒です。
UPDATE `users` SET `seijin` = 1 WHERE `age` >= 20
LIGはWebサイト制作を支援しています。ご興味のある方は事業ぺージをぜひご覧ください。