

`save()` と `updateAll()` は違い、modified
カラムが自動で更新されないのと、更新する値は自分の方でサニタイズする必要があります。

どういった考えてこのような実装になっているのでしょうか？


CC BY-SA 3.0
2015-02-20T01:42:25.873
6802
2015-02-21T15:24:29.620
2015-02-20T04:04:42.383
7926
8419
question
cakephp
updateAllについて


「値をサニタイズしないといけない」と考えるならデメリットですが、「値の代わりにSQLの式を指定できる」ということでもあります。これは複数のレコードを一度に更新する時に便利です。

例えば「20歳未満のユーザーの所持金を100増やしたい」というケースを考えます。

もし`save`でやるなら、`find('all',
...)`で対象レコードを取得して、一件ずつ更新することになるでしょう。これは効率が悪いですね。SQLならこうやって書けるのに。

[code]

    UPDATE users SET money = money + 1 WHERE age < 20
    
[/code]

これと同じことがCakePHP上でできるのが、`updateAll`です。

[code]

    $this->User->updateAll(
        array('money' => 'money + 100'),
        array('age <' => '20')
    );
    
[/code]

もし`updateAll`が自動でサニタイズする仕様なら、`money + 100`という式を書くことができず、「money +
100」という文字列になってしまいます。

`modified`が更新されないことについては上記のようなはっきりした理由は思いつきませんが、「updateクエリのようなもの」として考えれば、なるべく余計なことはしないというデザインなのかもしれません。


CC BY-SA 3.0
2015-02-20T05:16:37.117
6823
2015-02-21T15:24:29.620
2015-02-21T15:24:29.620
8000
8000
6802
answer