FuelPHPでDUPLICATE KEY UPDATE

なるべくDBへのアクセスを減らして、テーブルにレコードが存在しないときはInsert、テーブルに登録済みの場合は商品名を更新したいときなどに使う。

  • 更新前
id(PK) title
1 foo
2 bar

<?php
        $data[] = ['id' => 1, 'title' => 'hoge'];
        $data[] = ['id' => 2, 'title' => 'fuga'];

        $query = \DB::insert('products')
            ->columns(
                ['id', 'title']);

        foreach ($data as $item) {
            $query->values(
                [
                    $item['id'],
                    $item['title'],
                ]);
        }

        \DB::query($query->compile() . "ON DUPLICATE KEY UPDATE `title` = VALUES(`title`), `updated_at` = NOW()")->execute();

  • 更新後
id(PK) title
1 hoge
2 fuga

UPDATEされるのは、UNIQUEインデックスまたはPRIMARY KEYに重複した値を発生させる行が挿入された場合のみ。
idがUNIQUEかPRIMARY KEYではない場合は、INSERTされることになる。