CakePHPでUPDATE

CakePHPでデータベースのテーブルにデータを保存するには、save()を使います。

$data = array('User', array('name' => 'hoge', 'birth' => '1988-01-01', 'b_type' => 'A'));
$this->User->save($data);

この命令により以下のSQLが実行されます。

INSERT INTO users ('name', 'birth', 'b-type') value ('hoge', '1988-01-01', 'A');
SELECT * FROM users;
id name birth b_type
1 hoge 1988-01-01 A

作られたデータをUPDATEしたい場合には、主キーの「id」を指定してsaveすればUPDATEできます。

$data = array('User', array('id' => 1, 'name' => 'foo'));
$this->User->save($data);

UPDATE users SET name = 'foo', birth = '1988-01-01', b_type = 'A' WHERE id = 1;

SELECT * FROM users;
id name birth b_type
1 foo 1988-01-01 A

しかし、この方法ではUPDATEする必要のないデータまで同じ値でUPDATEしてしまいます。
これを回避するために、save()にはいくつかの引数を与えることができます。

構文1
save(array $data = null, boolean $validate = true, array $fieldList = array())

構文2
save(array $data = null, array $params = array())
array(
 'validate' => true,
 'fieldList' => array(),
 'callbacks' => true //other possible values are false, 'before', 'after'
)

引数を指定してnameだけをUPDATEしてみましょう。

$data = array('User', array('id' => 1, 'name' => 'bar'));
$fields = array('name');
$this->User->save($data, false, $fields);

UPDATE users SET name = 'bar' WHERE id = 1;

SELECT * FROM users;
id name birth b_type
1 bar 1988-01-01 A

余計なSQLは避けたほうがいいので、しっかり引数を与えて制御したほうがいいようです。

参考

http://book.cakephp.org/ja/view/75/Saving-Your-Data