カテゴリ: Laravel 更新日: 2026/03/26

Laravelのモデルイベント(creating, updating)を使う方法

Laravelのモデルイベント(creating, updating)を使う方法
Laravelのモデルイベント(creating, updating)を使う方法

先生と生徒の会話形式で理解しよう

生徒

「Laravelでデータを保存するときに、自動で値を設定したりチェックしたりする方法ってありますか?」

先生

「はい、それにはEloquentのモデルイベントを使うと便利です。例えばcreatingupdatingといったイベントがあります。」

生徒

「モデルイベントって何ですか?」

先生

「モデルイベントとは、モデルがデータベースに保存される前後など、特定のタイミングで自動的に処理を行う仕組みです。データが作られる前に値を加工したり、更新される前にチェックしたりできます。」

生徒

「なるほど、具体的にはどうやって使うんですか?」

先生

「では、基本的な使い方を順に見ていきましょう。」

1. creatingイベントで「新規保存前」に自動処理を追加する

1. creatingイベントで「新規保存前」に自動処理を追加する
1. creatingイベントで「新規保存前」に自動処理を追加する

Laravelでデータを新しく保存する際、「保存ボタンが押された瞬間に、自動で特定の値をセットしたい」という場面がよくあります。これを実現するのがcreatingイベントです。

例えば、プログラミング初心者の方でもイメージしやすい「会員登録システム」を考えてみましょう。ユーザー一人ひとりに、重複しない特別なID(UUID)を自動で割り振る仕組みを、モデルイベントを使って実装します。


namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;

class User extends Model
{
    /**
     * モデルの起動時に呼ばれるメソッド
     */
    protected static function booted()
    {
        // 1. データを新しく作ろうとしている(creating)タイミングをキャッチ
        static::creating(function ($user) {
            // 2. 保存される直前に、uuidという項目に自動でランダムな値を代入
            $user->uuid = (string) Str::uuid();
            
            // ログを出して動きを確認(デバッグ用)
            \Log::info('新しいユーザーのUUIDを自動設定しました:' . $user->uuid);
        });
    }
}

このコードのポイントは、bootedという「モデルが準備されたときに動くメソッド」の中に処理を書くことです。

なぜこれが便利なの?
もしこれを使わないと、ユーザーを登録する全ての場所(コントローラなど)で毎回UUIDを生成するコードを書かなければなりません。モデルイベントを使えば、「ユーザーが作られるときはいつでも、自動的にこのルールを適用する」という設定が一箇所で済むため、書き忘れやミスを未然に防ぐことができます。

実行時のイメージ:


1. ユーザーが名前を入力して登録ボタンを押す
2. Laravelが「creatingイベント」を検知
3. 自動で UUID (例: 550e8400-e29b-41d4-a716-446655440000) が生成され、データにセットされる
4. データベースに保存完了!

2. updatingイベントで「更新の直前」に自動処理を実行する

2. updatingイベントで「更新の直前」に自動処理を実行する
2. updatingイベントで「更新の直前」に自動処理を実行する

LaravelのEloquentモデルには、データベースのデータが書き換わる瞬間に特定の処理を割り込ませる「イベント」という便利な機能があります。その中でもupdatingイベントは、実際の更新処理が完了する直前に実行されるため、値の自動補完やログの記録に最適です。

プログラミング未経験の方でも分かりやすい例として、「誰がこのデータを編集したか」を自動で記録するサンプルを見てみましょう。これを設定しておけば、プログラムのあちこちで「更新者ID」を書き込むコードを何度も書く必要がなくなります。


protected static function booted()
{
    // データの更新(保存)が実行される直前のタイミングで呼び出される
    static::updating(function ($user) {
        // 現在ログインしているユーザーのIDを「updated_by」カラムに自動代入
        // これにより「いつ、誰が」変更したかの証跡を確実に残せます
        if (auth()->check()) {
            $user->updated_by = auth()->id();
        }
    });
}

このコードのポイントは、モデルのbootedメソッド内でstatic::updatingを定義している点です。これにより、システム内のどこかでユーザー情報が保存(save)されるたびに、Laravelが裏側で自動的にログインユーザーのIDをセットしてくれます。

例えば、管理画面で名前を変更して保存ボタンを押した際、内部では以下のような流れで処理が進みます。


1. 編集画面から新しい名前が送信される
2. Laravelが「updating」イベントを検知し、コードを実行
3. updated_by に「操作した人のID」を自動セット(← ここが今回のポイント!)
4. データベースの情報を最終的に書き換え(更新完了)

このように、手動で毎回カラムを指定しなくても「更新者の足跡」を自動で残せるようになるため、大規模なシステム開発やチームでの開発では必須級のテクニックと言えます。初心者の方は、まずは「保存される前に自動で何かの値を埋めるためのフック(引っ掛け)」として覚えておくと非常に役立ちます。

3. イベントを使うメリット

3. イベントを使うメリット
3. イベントを使うメリット

モデルイベントを使うことで、コントローラやサービスクラスに同じ処理を書かずに済み、コードがすっきりします。また、データの一貫性や自動化も簡単に実現できます。

例えば、全てのユーザー登録にUUIDを設定したり、全ての更新操作に更新者IDを記録したりする処理を一箇所にまとめて書けます。これにより、ミスを減らし、保守性の高いアプリケーションが作れます。

4. 注意点とポイント

4. 注意点とポイント
4. 注意点とポイント

モデルイベントは自動で呼ばれるため、コントローラ側で重複して同じ処理を書かないように注意しましょう。また、creatingupdatingは保存前のイベントなので、データベースに反映される前に値を加工できます。

イベントには他にもcreatedupdatedなど、保存後に処理するタイプもあります。まずはcreatingupdatingを覚えて、データ保存前の自動処理を実装できるようになることが大切です。

この仕組みを理解することで、Laravelで効率的にデータ管理ができ、アプリケーションの信頼性を高めることができます。

まとめ

まとめ
まとめ

今回はLaravel(ララベル)の強力な機能の一つである「モデルイベント(Eloquentイベント)」、特にデータの保存や更新のタイミングで威力を発揮する「creating」と「updating」について詳しく解説してきました。Webアプリケーションを開発していると、データベースに値を保存する直前に「特定のIDを自動付与したい」「特定のカラムを自動計算して埋めたい」といった場面が多々あります。これらをコントローラに都度書いていると、コードが煩雑になり、共通化も難しくなります。しかし、モデルイベントを活用すれば、モデル自身の責務としてこれらをスマートに一括管理できるのです。

モデルイベントを活用する実践的なメリット

Eloquentモデルイベントを利用することで、開発効率は劇的に向上します。主なメリットを整理してみましょう。

  • DRY(Don't Repeat Yourself)原則の維持: 同じ処理を複数のコントローラに書く必要がなくなります。
  • データの一貫性の担保: どこからデータを保存しても必ずイベントが実行されるため、値の漏れを防げます。
  • コードの可読性向上: ビジネスロジックがモデルに集約され、コントローラがスッキリします。

creatingとupdatingの具体的な使い分け

改めて、今回紹介した二つのイベントの違いを復習しておきましょう。

creating: 新規レコードが作成(insert)される直前にフックされます。IDの自動生成や初期ステータスの設定に向いています。

updating: 既存のレコードが変更(update)される直前にフックされます。変更履歴の記録や、更新者のID保存に最適です。

応用:複数のイベントを組み合わせたサンプルコード

実践では、一つのモデルに対して複数のイベントを定義することが一般的です。以下のサンプルプログラムでは、新規作成時には管理用コードを生成し、更新時には最終更新ユーザーを記録する、より現場に近い形の実装を紹介します。


namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Auth;

class Product extends Model
{
    /**
     * モデルの「初期起動」メソッド
     */
    protected static function booted()
    {
        // 新規作成時のみ実行される処理
        static::creating(function ($product) {
            // 商品コードをランダムな文字列で自動生成
            if (empty($product->product_code)) {
                $product->product_code = 'PRD-' . strtoupper(Str::random(8));
            }
            // ログ出力用などの初期設定
            logger('新しい商品が作成されます。');
        });

        // 更新時のみ実行される処理
        static::updating(function ($product) {
            // ログイン中であれば、更新者IDを自動保存
            if (Auth::check()) {
                $product->last_updated_by = Auth::id();
            }
            logger('商品ID:' . $product->id . ' が更新されます。');
        });
    }
}

このようにbootedメソッド内でstatic::creatingstatic::updatingを呼び出すだけで、Laravelが裏側ですべて面倒を見てくれます。非常に強力ですね。

モデルオブザーバー(Observers)という選択肢

もし、モデル内に書くイベント処理が肥大化してしまった場合は、「Observer(オブザーバー)」クラスを作成して処理を切り出す方法もあります。これにより、モデルクラス自体を軽量に保つことができます。


php artisan make:observer UserObserver --model=User

このコマンドを実行すると、イベント専用のクラスが生成されます。小規模なうちはモデル内のbootedで十分ですが、大規模な開発ではObserverの利用も検討してみてください。

最後に

Laravelのモデルイベントは、PHPでのWeb制作を一段上のレベルに引き上げてくれる素晴らしい仕組みです。特にCRUD操作(作成、読み取り、更新、削除)が中心となるシステムでは、この自動化の仕組みを知っているかどうかで、コードの品質に大きな差が出ます。まずは、今回紹介したコードを実際に自分のプロジェクトに組み込んで、データベースに反映される動きを確認してみてください。きっとその便利さに驚くはずです。

先生と生徒の振り返り会話

生徒

「先生、まとめまで読んで、モデルイベントの使いどころがかなり具体的にイメージできました!特にcreatingでUUIDを生成するのって、めちゃくちゃ実用的ですね。」

先生

「そう言ってもらえると嬉しいです。UUID以外にも、例えばブログ記事の『スラッグ(URLの一部)』をタイトルから自動生成して保存するといった使い方もよくされますよ。」

生徒

「あ、それ便利そう!でも、もしイベントの中でエラーが起きたらどうなるんですか?データベースの保存は止まってしまうんでしょうか?」

先生

「いい質問ですね。例えばcreatingイベントの中でfalseを返すと、実は保存処理自体がキャンセルされます。これを利用して、特定の条件を満たさない場合に保存をブロックする、といった簡易的なバリデーションのような使い方もできるんですよ。」

生徒

「へぇー!単に値を埋めるだけじゃなくて、守り神みたいな役割もできるんですね。ちなみに、これってsave()メソッドを呼んだときに勝手に動くんですか?」

先生

「その通りです。save()だけでなく、create()update()といったEloqunetのメソッドを介せば自動的に発火します。ただし、DB::table('users')->update(...)のように、クエリビルダを直接使って更新した場合にはイベントが飛ばないという注意点があります。ここは初心者がハマりやすいポイントですね。」

生徒

「なるほど、Eloquentを通すのが大前提なんですね。使い分けを意識します!あと、更新者のIDを保存するupdatingの例もありましたが、これってログインしていないユーザーが操作したときはどうすればいいですか?」

先生

「その場合は、Auth::check()でチェックを入れて、ログインしている場合のみ値をセットするように条件分岐を書くのが一般的ですね。先ほどのサンプルコードにもその処理を入れましたが、エラーを防ぐための基本的な工夫です。」

生徒

「分かりました!モデルイベントを使いこなして、スマートなLaravelエンジニアを目指します!次は削除したときのdeletingイベントとかも調べてみたいです。」

先生

「いい意気込みですね!削除時に紐づく子データを一緒に消すといった処理もdeletingでよく書かれます。ぜひステップアップして挑戦してみてくださいね。」

カテゴリの一覧へ
新着記事
New1
Symfony
Symfonyのルーティング構成の基本を完全解説!初心者向けにYAML・PHP・アノテーション方式をやさしく紹介
New2
Laravel
Laravelのルートグループの使い方!初心者でもわかるprefixやミドルウェアの設定方法
New3
PHP
PHPのswitch文の使い方!多くの条件分岐をスッキリ書く方法と注意点
New4
Symfony
Symfony学習に役立つおすすめドキュメント・教材・リソース一覧【初心者向け】
人気記事
No.1
Java&Spring記事人気No1
PHP
PHPで文字列を結合する方法!ドット演算子と代入演算子の使い方を徹底解説
No.2
Java&Spring記事人気No2
PHP
PHPのif文の使い方を完全ガイド!初心者でもわかる条件分岐の基本
No.3
Java&Spring記事人気No3
Symfony
Symfonyで翻訳(i18n)機能を使う方法を解説!初心者にもわかる国際化対応の基本
No.4
Java&Spring記事人気No4
Laravel
Laravelのresponse()関数の使い方を完全ガイド!初心者でもわかるレスポンス制御とHTTPレスポンスの基本
No.5
Java&Spring記事人気No5
Laravel
LaravelのAPIルーティングを設定する方法!初心者でもわかるapi.phpの使い方
No.6
Java&Spring記事人気No6
Laravel
LaravelでRemember Me(ログイン状態保持)機能を実装する方法を完全解説!初心者でも安心の認証入門
No.7
Java&Spring記事人気No7
Laravel
Laravelのインストール方法まとめ!ComposerとLaravel Installerの使い方
No.8
Java&Spring記事人気No8
PHP
PHPのswitch文の使い方!多くの条件分岐をスッキリ書く方法と注意点