オフィス狛 技術部です。Codeigniterのクエリビルダクラスには便利なメソッドが多くありますが、
その中でも特殊なのが「update_batch」です。
複数レコードへの更新が発生する際、
ループで回し、update文を複数回実行する事も可能ですが、
この「update_batch」を使えば、一回の処理で済ませる事が出来ます。
例えば、更新用に以下の様な配列を作成したとします。
$data = array(
array(
'emp_id' => 'A001' ,
'name' => 'koma taro' ,
'tel' => '090-0000-1111'
),
array(
'emp_id' => 'A002' ,
'name' => 'koma saya' ,
'tel' => '090-0000-2222'
)
);
そして、update文を実行する際は、
$this->db->update_batch('emptable', $data, 'emp_id');
となります。
「emptable」(社員テーブル)が更新対象のテーブル名、
「data」が先程作成した配列、
「emp_id」(社員ID)が更新時に条件として使用するカラムの指定、となります。
つまり、
- 社員テーブルの社員IDが「A001」の名前を「koma taro」に、電話番号を「090-0000-1111」に変更する。
- 社員テーブルの社員IDが「A002」の名前を「koma saya」に、電話番号を「090-0000-2222」に変更する。
普通に考えると、update文を2回実行しないといけない様に思えます。
しかし、「update_batch」の呼び出しは1回です。
一体内部ではどんなSQLに展開しているのでしょうか?
・・・という事で、実際に実行されるSQLを調べてみると、
UPDATE `emptable` SET `name` = CASE
WHEN `emp_id` = 'A001' THEN 'koma taro'
WHEN `emp_id` = 'A002' THEN 'koma saya'
ELSE `name` END,
`tel` = CASE
WHEN `emp_id` = 'A001' THEN '090-0000-1111'
WHEN `emp_id` = 'A002' THEN '090-0000-2222'
ELSE `tel` END
WHERE `emp_id` IN ('A001','A002')
なんともトリッキーですが、確かにこれだとSQL文は1つで済みます。
update文を何度も実行するよりは、処理的にも早いと思います。
でも、ここでふと疑問が。
「複数条件指定する場合はどうするのだろう?」
ここに罠が潜んでいるのですが、ちょっと長くなってしまったので、
次回に持ち越します。
次回:Codeigniterのupdate_batchで複数条件指定する時の罠。(whereメソッドに注意編)
ActiveRecord , CodeIgniter , PHP
0 件のコメント:
コメントを投稿