開発ブログ

株式会社Nextatのスタッフがお送りする技術コラムメインのブログ。

電話でのお問合わせ 075-744-6842 ([月]-[金] 10:00〜17:00)

  1. top >
  2. 開発ブログ >
  3. PHP >
  4. Laravel >
  5. Eloquentのupsert() 知ってると便利ですよ。1つのクエリで複数のレコードにアプローチしよう。
no-image

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を使うことで実現することができます。

ぜひみなさんも使ってみて下さい。

  • posted by かっちゃん
  • Laravel
TOPに戻る