こんにちは、さるまりんです。
DBにデータを登録する時、insert or update、新規登録か更新か
select
して- データが取得できれば
insert
- そうでなければ
update
このケースは頻繁に出てくると思います。
insert+update
でupsert
と呼ばれるものです。
これを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していたところをこちらもシンプルに記述できました。
どちらもわかりやすいので積極的に使っていきたいと思います。
読んでくださってありがとうございます。
それではまた!