0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Seederの作成で、insertとinsertOrUpdateとcreateの使い分けについて

Posted at

Laravelでデータベースの初期データを投入する際に役立つSeederですが、データの挿入方法としてinsertinsertOrUpdatecreateなど複数の手法があります.
どの場面でどのメソッドを使うべきか、使い分け方について具体的に解説します.

Seederでの基本的なデータ挿入方法

Seederを利用することで、テストや開発時に必要なデータを簡単にデータベースへ投入できます.
insertinsertOrUpdatecreateはそれぞれ異なる特徴を持ち、目的や要件に応じて適切に選ぶことが重要です.

1. insertメソッド

insertメソッドは複数行のデータを一括で挿入するのに適しています.
Laravelのクエリビルダーを用いると以下のように記述できます.

DatabaseSeeder.php
use Illuminate\Support\Facades\DB;

DB::table('users')->insert([
    ['name' => 'Taro', 'email' => 'taro@example.com', 'created_at' => now()],
    ['name' => 'Hanako', 'email' => 'hanako@example.com', 'created_at' => now()]
]);

特徴

  • 複数レコードを一度に挿入できるのでパフォーマンスが良い.
  • insertでは**IDの自動生成(auto-increment)**が考慮されないため、データの重複には注意が必要です.
  • レコードが既に存在する場合でも、挿入されてしまいます.

使い所

  • データが完全に新規で、存在するレコードとの重複チェックが不要な場合.
  • テストデータを一括で投入する場合.

2. updateOrInsertメソッド

レコードが存在すれば更新、存在しなければ挿入する便利なメソッドです.

DatabaseSeeder.php
use Illuminate\Support\Facades\DB;

DB::table('users')->updateOrInsert(
    ['email' => 'taro@example.com'], // 検索条件
    ['name' => 'Taro', 'updated_at' => now()] // 更新内容
);

特徴

  • レコードの存在チェックを内部で行うため、データの重複を防ぎます.
  • updateOrInsertと似ていますが、updateOrInsertは単一レコードに対してのみ動作します.

使い所

  • 特定の条件でデータが存在する場合のみ更新、存在しない場合は挿入する場合.
  • 主キーやユニークキーを基準に重複チェックが必要なケース.

注意点

  • 複数レコードを一度に処理することはできません.性能面でinsertよりやや劣ります.

3. createメソッド

createメソッドはEloquentモデルを通してレコードを挿入する方法です.

DatabaseSeeder.php
use App\Models\User;

User::create([
    'name' => 'Taro',
    'email' => 'taro@example.com',
    'password' => bcrypt('password123')
]);

特徴

  • モデルのインスタンスを利用するため、created_atupdated_atなどのタイムスタンプが自動で設定されます.

使い所

  • Eloquentモデルを活用したい場合.
  • 単一のレコードを追加する場合やタイムスタンプが必要なケース.
  • データのバリデーションやアクセサ/ミューテータを利用したい場合.

  • fillableプロパティを設定することで、セキュリティリスクを軽減します.
User.php
protected $fillable = ['name', 'email', 'password'];

個人的な感想とベストプラクティス

個人的には開発中のSeederでは、insertを使うことが多いです.
insertではcreated_atupdated_atが設定されないため、管理が面倒です.
ただし、大量のデータを一括で投入する場合は**insertが高速です.
本番環境のデータ投入など、性能を重視する場面ではこちらを選ぶべきだと思います.


テスト環境ではupdateOrInsertが便利

一方で、テスト環境のデータベース作成を考えると、updateOrInsertを利用する方が良いケースも多いと思います.

理由

  • データの重複を避けつつ、すでに存在するレコードを更新できる.
  • テストデータの投入が何度も行われる場合でも、同じデータが重複して挿入されることを防げる.

具体例として、テスト時に特定の条件のレコードを保持したまま、データを追加・更新する場合に役立ちます.

DatabaseSeeder.php
DB::table('users')->updateOrInsert(
    ['email' => 'taro@example.com'], // 条件
    ['name' => 'Taro', 'updated_at' => now()] // 更新・挿入内容
);

このようにupdateOrInsertを使えば、テスト環境でシンプルかつ安全にデータを管理できるため、特に繰り返しSeederを実行するシーンではおすすめです.


このように、使う場面や目的に合わせてinsertupdateOrInsertを使い分けることが、効率的なSeeder作成のポイントだと思います.

まとめ

LaravelのSeederにおけるinsertinsertOrUpdatecreateの使い分けについて解説しました.

  • insert:高速だが重複チェックはない.
  • insertOrUpdate:重複を避けつつ更新or挿入する.
  • create:Eloquentモデルを活用し、タイムスタンプが自動設定される.

場面に応じて使い分けることで、効率よくデータを投入できるようになります.

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?