【Laravel】SeederクラスのWithoutModelEventsは何をしているのか?

laravelアイキャッチ Laravel

こんにちは、かつコーチです。

Seederって初期設定(デフォルト)でテーブルにデータを挿入するときに使いますよね。

そのときに、WithoutModelEventsという見慣れないものがあったので解説します。

WithoutModelEventsとは?

WithoutModelEventsは、use Illuminate\Database\Console\Seeds\WithoutModelEvents; として読み込んでいますね。

これは Seeder クラスで Eloquent モデルのイベントを一時的に無効化 するためのもので、

データベースのシーディング時に

Eloquentのイベント(モデルの作成、更新、削除時に発生するイベント)

を除外したい場合に使われます。

モデルイベントとは?

通常、Eloquent モデルには以下のような イベント が存在します:

  • creating:モデルが作成される前に発生
  • created:モデルが作成された後に発生
  • updating:モデルが更新される前に発生
  • updated:モデルが更新された後に発生
  • deleting:モデルが削除される前に発生
  • deleted:モデルが削除された後に発生

これらのイベントを利用することで、

たとえば、モデルが作成されるときに特定の処理を行うことができます。

WithoutModelEvents の目的

データベースのシーディング中にモデルイベントがトリガーされると、

予期せぬ動作やパフォーマンス低下が起こる可能性があります。

シーディングでは大量のデータを挿入することがあるため、

そのたびにイベントが発生すると処理が遅くなる可能性があります。

たとえば、モデルに対して「作成時に通知を送る」といったイベントリスナーがある場合、

シーディングで1000件のレコードを挿入したら1000回通知を送ることになります。

これを避けるために、WithoutModelEvents を使用してシーディング中はモデルイベントを無効化し、

パフォーマンスを向上させることができます。

どのようなときに利用するか

次のような状況で WithoutModelEvents を使用すると便利です:

  1. 大量のデータをシーディングする際:大量のレコードをシーディングするときにイベントリスナーがトリガーされると、余計な処理が行われ、シーディングの速度が遅くなってしまいます。このような場合、イベントを無効化して効率的にデータを挿入できます。
  2. シーディング時にイベントによる副作用を避けたいとき:たとえば、モデル作成時にメールを送信する処理があった場合、シーディング時にこれを実行すると本来不要なメールが大量に送られる可能性があります。このような副作用を防ぎたいときに、WithoutModelEvents でイベントを無効化します。

実際の使用例

Seederファイルの冒頭で次のように記述します。

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Illuminate\Database\Console\Seeds\WithoutModelEvents; // ここで指定

class UserSeeder extends Seeder
{
    use WithoutModelEvents; // シーディング中にモデルイベントを無効化

    public function run()
    {
        \App\Models\User::factory(10)->create(); // イベントなしで10件のデータを作成
    }
}

まとめ

  • WithoutModelEvents はシーディング中に モデルのイベントを無効化 するための機能です。
  • シーディング時に余計な処理や副作用が起きないようにするため、特に大量のデータ挿入や、シーディング中にイベントが不要な場合に役立ちます。

このように、シードデータを効率的に挿入したい場合に WithoutModelEvents を使うことで、

シード実行時のパフォーマンス向上不必要な処理の抑制が可能です。

タイトルとURLをコピーしました