Eloquentのupsert() 知ってると便利ですよ。1つのクエリで複数のレコードにアプローチしよう。
お久しぶりです、かっちゃんです。
最近夜になると涼しくなってきましたね、夏の終わりを感じています。
今回はupsertというメソッドの紹介をしたいと思います。
upsertの使い方を記述しますので、migrationやModelの作成については割愛させていただきます。
前提条件
- PHP 8.1.16
- Laravel Framework 8.83.23
upsertとは
複数のレコードに対して更新対象となるデータが存在すればUPDATEを実行し、無ければINSERTを行うメソッドです。 似たようなメソッドでupdateOrCreateがありますが、updateOrCreateは1つのレコードに対して行うもので、upsertは複数のレコードに対して行うことができます。
使い方
以下のようなusersテーブルがあったとします。
id | name | age | address |
---|---|---|---|
1 | かっちゃん | 28 | 東京 |
2 | さわやん | 26 | 沖縄 |
このusersテーブルのレコードを以下のように変更したいと思います。
id | name | age | address |
---|---|---|---|
1 | かっちゃん | 30 | 北海道 |
2 | さわやん | 28 | 大阪 |
3 | もりりん | 34 | 愛知 |
以下の通りupsertメソッドを実行します。
User::upsert(
[
['id' => 1, 'name' => 'かっちゃん', 'age' => 30, 'address' => '北海道'],
['id' => 2, 'name' => 'さわやん', 'age' => 28, 'address' => '大阪'],
['id' => null, 'name' => 'もりりん', 'age' => 34, 'address' => '愛知']
],
['id'],
['age', 'address']
);
引数の意味については以下です。
- 第一引数
updateやinsertを行いたい値を配列で渡す。
- 第二引数
既存レコードの特定に利用するカラムを配列で渡す。
レコードを一意に識別できる必要があるため、プライマリーキーやユニークキーが設定されているカラムを渡すと良い。
- 第三引数
updateが行われる際に更新したいカラムを配列で渡す。
省略すると全カラムが更新対象カラムとなる。
まとめ
upsertを使わなければupdateOrCreateをforeachでぶん回すなどの力技を行わなければダメでしたが、upsertを使うことでかなりスッキリとしたコードにすることができます。
また、まとめてレコードを追加したい時もupsertを使うことで実現することができます。
ぜひみなさんも使ってみて下さい。