開発ブログ

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

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

  1. top >
  2. 開発ブログ >
  3. PHP >
  4. Laravel >
  5. 【Laravel】クエリビルダーのupdateOrInsert()にクロージャを渡して使用する方法
no-image

【Laravel】クエリビルダーのupdateOrInsert()にクロージャを渡して使用する方法

はじめまして!今年1月に入社したしゅんちゃんです。
業務ではLaravelを使用したバックエンドをメインに開発させていただいています。
今後ともよろしくお願いいたします!
本日は、Laravel 11.10からクエリビルダーのupdateOrInsert()メソッドにクロージャを渡すことができるようになっているみたいなので、ご紹介しようと思います。
https://laravel-news.com/laravel-11-10-0
 

前提条件

  • Laravel Framework 11.10
  • PHP 8.3

そもそもupdateOrInsert()メソッドとは

クエリビルダーのupdateOrInsert()メソッドは、データベース内に検索条件に一致するレコードが存在する場合、そのレコードを更新し、一致するレコードが存在しない場合は新しいレコードを挿入します。

使用例としては以下の通りです。


DB::table('users')
    ->updateOrInsert(
        ['name' => 'しゅんちゃん'],
        ['email' => 'shunchan@example.com', 'age' => '25']
    );

第一引数に検索条件、第二引数には更新または挿入するデータをカラム名と値のペアで指定します。
データベースに第一引数で指定した名前のレコードが存在すれば、メールアドレスと年齢を更新します。 存在しない場合は、新しく第一引数と第二引数をマージした新しいレコードを挿入します。
 

クロージャを渡して使用する

本題ですが、Laravel 11.10から追加された、クロージャを渡してクエリビルダーのupdateOrInsert()メソッドを使用する方法です。
上記コードと同じテーブルに対し、updateOrInsert()の第二引数にクロージャを利用した例が以下になります。

DB::table('users')
    ->updateOrInsert(
     ['name' => 'しゅんちゃん'], 
     fn ($exists) => $exists ? [ 
         'name' => 'しゅんちゃん', 
         'email' => 'shunchan@example.com', 
     ] : [ 
         'name' => 'しゅんちゃん',
         'email' => 'shunchan@example.com', 
         'age' => '25', 
     ], 
 );

クロージャ内でbool値の$existsという変数が渡され、データベースに第一引数で指定したレコードが存在するかどうかで、更新または挿入する内容を指定することができます。
コード量こそ少し多くなりましたが、更新される内容と挿入される内容を切り離して考えることができます。

まとめ

クエリビルダーのupdateOrInsert()メソッドでクロージャを使用する方法について紹介しました!
是非、Laravelをアップデートして試してみてください。

参考)Laravel - The PHP Framework For Web Artisans - Update or Insert
  • posted by しゅんちゃん
  • Laravel
TOPに戻る