Laravel : Eloquentとクエリビルダでupsertする方法

こんにちは、さるまりんです。

DBにデータを登録する時、insert or update、新規登録か更新か

  1. selectして
  2. データが取得できればinsert
  3. そうでなければupdate

このケースは頻繁に出てくると思います。
insert+updateupsertと呼ばれるものです。

これをLaravelで行うにはEloquent ORMでは関数updateOrCreate()を使います。

例で見てみましょう。

Product::updateOrCreate(
    ['id' => 101],
    ['name' => '砂時計', 'price' => 1000]
);

一つ目の配列が検索される条件、二つ目の配列が更新するデータの内容です。
商品IDが101の商品を検索して、見つかった場合は、その商品の商品名(name)を「砂時計」に、価格(price)を1000に更新(update)します。
見つからなかった場合は、商品ID101で商品名が「砂時計」価格が1000の商品が新たに作成(insert)されます。

上にも書いたロジックselect → insert/updateがが1ステートメントで記述できるのはシンプルですね。

こんどはクエリビルダを使って同じことをしてみます。

クエリビルダでは関数updateOrInsert()を使います。

同じように例で見てみます。

DB::table('products')
    ->updateOrInsert(
        ['id' => 101],
        ['name' => '砂時計', 'price' => 1000]
    );

一つ目の配列が検索される条件、二つ目の配列が更新するデータの内容、関数名が微妙に違いますが、やりたいことは同じです。
商品IDが101の商品を検索して、見つかった場合は、その商品の商品名(name)を「砂時計」に、価格(price)を1000に更新(update)します。見つからなかった場合は、商品ID101で商品名が「砂時計」価格が1000の商品が新たに作成(insert)されます。

毎度ifで分岐してinsert/updateしていたところをこちらもシンプルに記述できました。

どちらもわかりやすいので積極的に使っていきたいと思います。

読んでくださってありがとうございます。

それではまた!