カテゴリ: Laravel 更新日: 2026/07/31

Laravelの通知機能を徹底解説!データベースに通知を保存するtoDatabaseの使い方

Laravelでデータベースに通知を保存する方法(`toDatabase`)
Laravelでデータベースに通知を保存する方法(`toDatabase`)

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

生徒

「Laravelで作っているサイトで、ユーザーに『メッセージが届きました』というお知らせを表示したいのですが、どうすればいいですか?」

先生

「それなら、Laravelの『通知(Notification)』という機能を使うのが一番便利ですよ。」

生徒

「通知って、スマホのプッシュ通知みたいなものですか?データベースに内容を保存して、あとで一覧で見られるようにしたいんです。」

先生

「まさにその通りです!Laravelには、通知内容をデータベースに書き込む『toDatabase』という仕組みがあります。初心者の方でも設定しやすいので、一緒に学んでいきましょう。」

1. Laravelの通知機能とデータベース保存の仕組み

1. Laravelの通知機能とデータベース保存の仕組み
1. Laravelの通知機能とデータベース保存の仕組み

Laravel(ララベル)というPHPのフレームワークには、ユーザーに対して何かを知らせるための通知(Notification)という非常に強力な機能が備わっています。例えば、会員サイトで新しいコメントがついたときや、商品の発送が完了したときなどに、ユーザーへお知らせを送ることができます。

通知を送る方法はいくつかあります。メールで送る、LINEのようなチャットツールに送る、そして今回解説するデータベースに保存するという方法です。データベースに保存する最大のメリットは、ユーザーが自分のマイページにログインした際、「未読の通知が3件あります」といった形式で、過去のお知らせをいつでも確認できるシステムを簡単に作れる点にあります。このとき、プログラムの中で使われるのがtoDatabaseというメソッド(命令)です。

「データベース」とは、たくさんのデータを整理して保管しておくための「巨大な棚」のようなものだと考えてください。Laravelはこの棚の中に「通知専用の引き出し」を自動で作ってくれるため、私たちは複雑なコードを書かずに、どのお知らせを誰に送るかだけを考えれば良いのです。

2. 通知データを保存するための準備(テーブル作成)

2. 通知データを保存するための準備(テーブル作成)
2. 通知データを保存するための準備(テーブル作成)

まず最初に、通知を保存するための「引き出し」をデータベースに作る必要があります。プログラミングの世界では、この引き出しのことをテーブルと呼びます。通常、テーブルを作るには複雑なSQL(エスキューエル)という言語を扱う必要がありますが、Laravelならコマンド一発で準備が整います。

パソコンの「ターミナル」や「コマンドプロンプト」を開いて、プロジェクトのフォルダで以下の命令を入力してみましょう。これによって、通知データを管理するための設計図が作成されます。


php artisan notifications:table
php artisan migrate

「php artisan notifications:table」というコマンドは、通知を保存するための専用テーブル(notificationsテーブル)の設計図を作成する命令です。「php artisan migrate」は、その設計図を実際にデータベースに反映させて、テーブルを実体化させる命令です。これで、データを保存する準備が完了しました。これを忘れると、いくら通知を送っても保存する場所がないためエラーになってしまいます。

3. 通知クラスを作成してみよう

3. 通知クラスを作成してみよう
3. 通知クラスを作成してみよう

次に、どのような内容を通知するかを決める「通知クラス」を作成します。クラスとは、プログラムの動きをまとめた「型紙」のようなものです。今回は「新しいメッセージが届きました」という通知を例に作成してみましょう。


php artisan make:notification MessageReceived

このコマンドを実行すると、app/Notificationsというフォルダの中にMessageReceived.phpというファイルが出来上がります。このファイルの中に、「この通知はデータベースに保存してください」という設定と、「どんなメッセージ内容にするか」を書いていきます。

用語解説:「クラス」とは、特定の機能を持った部品のようなものです。「メソッド」は、その部品ができる動作(命令)のことを指します。ここでは「通知を送る」という部品を作っているイメージです。

4. toDatabaseを使って通知内容を設定する

4. toDatabaseを使って通知内容を設定する
4. toDatabaseを使って通知内容を設定する

それでは、作成されたMessageReceived.phpの中身を書き換えていきましょう。ここで重要になるのがviaメソッドとtoDatabaseメソッドです。


namespace App\Notifications;

use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Notification;

class MessageReceived extends Notification
{
    use Queueable;

    // どのルートで通知を送るかを決める
    public function via($notifiable)
    {
        return ['database']; // データベースに保存することを指定
    }

    // データベースに保存するデータの内容を決める
    public function toDatabase($notifiable)
    {
        return [
            'title' => '新着メッセージ',
            'content' => 'あなた宛てに新しいメッセージが届いています。',
            'url' => '/messages/1',
        ];
    }
}

まず、viaという場所で['database']と書くことで、「この通知はメールではなくデータベースに送るよ」とLaravelに伝えています。そして、toDatabaseという場所で、実際に保存したい内容を「連想配列(れんそうはいれつ)」という形式で記述します。連想配列とは、名札(キー)と中身(値)をセットにしたデータの持ち方のことです。上記の例では、「title」という名札に「新着メッセージ」という文字を入れています。このデータが、先ほど作成したテーブルに自動的に保存されます。

5. 実際にユーザーへ通知を送る方法

5. 実際にユーザーへ通知を送る方法
5. 実際にユーザーへ通知を送る方法

通知の型紙ができたら、次は実際に特定のユーザーに対して通知を発行するコードを書きます。Laravelでは、ユーザー情報を表す「Userモデル」を使って簡単に通知を送ることができます。例えば、ログインしているユーザーに通知を送る場合は、以下のようなコードになります。


use App\Models\User;
use App\Notifications\MessageReceived;
use Illuminate\Support\Facades\Auth;

// 1. 通知を送りたい相手(ユーザー)を取得
$user = Auth::user();

// 2. 通知を送る
$user->notify(new MessageReceived());

この$user->notify()という命令を実行した瞬間に、Laravelは裏側でデータベースのnotificationsテーブルに新しい行を追加してくれます。これを実行するために、自分で「INSERT文」などの難しいデータベース操作を書く必要は一切ありません。これがフレームワークを使う最大の利便性です。パソコンを初めて触るような方でも、この一行を覚えるだけで「ユーザーにお知らせを届ける」という高度な機能が実装できてしまいます。

6. 保存された通知を画面に表示してみよう

6. 保存された通知を画面に表示してみよう
6. 保存された通知を画面に表示してみよう

データベースに保存しただけでは、ユーザーは通知に気づけません。最後に、保存されたデータを取得して、HTMLの画面に表示する方法を確認しましょう。LaravelのUserモデルには、最初から通知を受け取るための機能が備わっています。


// ユーザーのすべての通知を取得する
$notifications = Auth::user()->notifications;

foreach ($notifications as $notification) {
    // toDatabaseで設定したデータは 'data' という項目に入っている
    echo $notification->data['title'];
    echo $notification->data['content'];
}

データベースには、いつ通知が作られたか(created_at)や、その通知が既に読まれたかどうか(read_at)という情報も一緒に保存されています。これを利用すれば、「未読の通知だけを赤色で表示する」といった工夫も可能になります。初心者の方は、まず「data」という場所の中に、自分がtoDatabaseで設定した内容が入っていることだけを理解しておけば大丈夫です。

例えば、Blade(ブレイド)というLaravel専用のテンプレートエンジンを使えば、以下のようにHTMLの中に通知一覧を組み込むことができます。


<div class="list-group">
    @foreach (Auth::user()->notifications as $notification)
        <a href="{{ $notification->data['url'] }}" class="list-group-item list-group-item-action">
            <i class="bi bi-bell"></i>
            <strong>{{ $notification->data['title'] }}</strong>
            <p>{{ $notification->data['content'] }}</p>
            <small>{{ $notification->created_at->format('Y/m/d H:i') }}</small>
        </a>
    @endforeach
</div>

このように、Bootstrap 5のクラス(list-groupなど)を組み合わせることで、スマホのアプリのような綺麗な通知一覧画面をあっという間に作ることができます。@foreachは「データの数だけ繰り返し処理をする」という便利な合言葉です。これを使えば、通知が1件でも100件でも、自動的にリストを表示してくれます。

7. 複数の通知ルートを使い分ける応用

7. 複数の通知ルートを使い分ける応用
7. 複数の通知ルートを使い分ける応用

ここまではデータベースへの保存(toDatabase)を解説してきましたが、実際の運用では「データベースに保存しつつ、同時にメールも送りたい」というケースがよくあります。Laravelの通知機能は、そうした要望にも柔軟に応えてくれます。先ほどのviaメソッドを少し書き換えるだけです。


public function via($notifiable)
{
    // データベースとメールの両方で送る設定
    return ['database', 'mail'];
}

このように配列の中に'mail'を追加するだけで、システムは自動的に両方の処理を行ってくれます。データベース用にはtoDatabaseが呼ばれ、メール用には別途toMailというメソッドを用意すれば良いのです。通知機能が「多目的(マルチチャネル)」と言われる理由は、この使い勝手の良さにあります。

プログラミング未経験の方にとって、最初は「どこに何を書けばいいのか」迷うかもしれません。しかし、基本は「通知クラスを作る」「保存場所を決める(via)」「内容を決める(toDatabase)」「実行する(notify)」という4つのステップだけです。何度も練習して、便利な通知システムを構築してみてください。

まとめ

まとめ
まとめ

今回の記事では、Laravelが提供する強力な通知機能の中でも、特に実用性の高い「データベース保存(toDatabase)」について詳しく解説してきました。Webアプリケーションを運用する上で、ユーザーに対して何らかのアクションを促したり、システムからの重要なメッセージを伝えたりする「通知」は欠かせない要素です。Laravelの通知システムを利用すれば、メールやブラウザ通知、SNS連携など多岐にわたる送信手段を一元管理できるため、開発効率が飛躍的に向上します。

データベース通知の実装ステップをおさらい

データベースへ通知を保存するまでの流れは、非常にシンプルで定型化されています。まずは、通知データを格納するための専用テーブルを準備することから始まります。Laravel標準のコマンドを使用することで、マイグレーションファイルが自動生成され、データベース内に構造化された「通知ボックス」が作成されます。この準備が整えば、あとは具体的な通知ロジックを記述する「通知クラス」を生成し、その中でどのようなデータを保持するかを定義するだけです。

実践的なサンプルコードとデータの持ち方

通知クラス内の toDatabase メソッドでは、PHPの連想配列を使用して自由な形式でデータを定義できます。例えば、通知の種類を識別するためのタイプ、表示用のアイコン、遷移先のURLなどをひとまとめにして保存することが可能です。これにより、フロントエンド側での出し分けが容易になります。以下に、より詳細な情報を盛り込んだ通知クラスの例を示します。


namespace App\Notifications;

use Illuminate\Notifications\Notification;

class SystemAlert extends Notification
{
    protected $message;
    protected $level;

    public function __construct($message, $level = 'info')
    {
        $this->message = $message;
        $this->level = $level;
    }

    public function via($notifiable)
    {
        return ['database'];
    }

    public function toDatabase($notifiable)
    {
        // データベースに保存されるJSONデータの内容を定義
        return [
            'message' => $this->message,
            'level' => $this->level,
            'action_url' => url('/dashboard'),
            'icon_class' => 'bi-exclamation-triangle',
        ];
    }
}

この通知を実際に発行する際は、以下のようにコントローラーやサービス層から呼び出します。Laravelの Notifiable トレイトが組み込まれているモデル(通常はUserモデル)であれば、即座に notify メソッドが利用可能です。


use App\Models\User;
use App\Notifications\SystemAlert;

// IDが1のユーザーを取得して通知を送信
$user = User::find(1);
$user->notify(new SystemAlert('システムメンテナンスのお知らせ', 'warning'));

未読・既読管理によるユーザー体験の向上

データベース通知の真骨頂は、既読管理にあります。Laravelの notifications テーブルには read_at カラムが存在し、ここが null であれば未読、タイムスタンプが入っていれば既読として扱われます。プログラム側で $user->unreadNotifications と記述するだけで未読分のみを取得できるため、「未読バッジ」の表示などが驚くほど簡単に実装できます。

また、全ての通知を既読にする処理も一行で記述可能です。ユーザーが通知一覧ページを開いた瞬間に既読フラグを立てるといった、細やかなユーザーインターフェースの構築を支援してくれます。


// 特定のユーザーの未読通知をすべて既読にする
$user->unreadNotifications->markAsRead();

SEOとパフォーマンスの観点から

検索エンジン最適化(SEO)の観点では、通知機能自体が直接検索順位に影響することはありませんが、ユーザーの滞在時間や再訪率を高める「エンゲージメント向上」のツールとして非常に有効です。ユーザーが自分宛ての情報を確認するために頻繁にサイトを訪れるようになれば、ドメイン全体の評価向上に繋がります。

技術的な注意点としては、大量のユーザーに対して一斉に通知を送る場合、同期処理で行うとレスポンスが遅延する可能性があります。その際はLaravelの「キュー(Queue)」機能を併用し、バックグラウンドで非同期に処理させるのがベストプラクティスです。toDatabase は非常に軽量な処理ですが、規模が大きくなるにつれてこうした最適化も視野に入れておきましょう。

Laravelの通知機能は、単純なメッセージ送信を超えて、ユーザーとシステムを繋ぐ架け橋となります。まずは基本となるデータベース保存をマスターし、アプリケーションの価値を一段上のレベルへと引き上げてください。

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

生徒

「先生、まとめまで読んでみて、通知機能の全体像がしっかり見えてきました! toDatabase を使うことで、単にデータを保存するだけでなく、未読・既読の管理まで自動化できるのが本当に便利ですね。」

先生

「その通りです。データベースに保存しておくことで、ユーザーが後から見返せるという安心感を与えられますし、プログラミング側でも $user->unreadNotifications を使って簡単に未読数を出せるのが大きな強みですね。」

生徒

「記事の中で、Bootstrap 5のアイコンを使ったり、Bladeテンプレートで一覧を表示する方法も学びましたが、これなら自分でもマイページにお知らせ欄が作れそうです。デザイン面でも bi-bell などのアイコンを使うと一気にプロっぽくなりますね!」

先生

「素晴らしい意気込みですね。通知データの中に url を含めておけば、クリックした時に特定の詳細ページへ飛ばすこともできます。ユーザーを迷わせない親切な設計を心がけてみてください。」

生徒

「はい!まずは自分のローカル環境で php artisan notifications:table を実行して、実際にデータがテーブルに入る様子を確認してみます。PHPのコードも notify メソッドを呼ぶだけでいいので、思っていたよりハードルが低くて安心しました。」

先生

「習うより慣れろ、です。まずは動かしてみて、中身のデータがどう変化するかをデータベース管理ツールなどで覗いてみると、理解がより深まりますよ。困ったときはいつでも聞いてくださいね。」

カテゴリの一覧へ
新着記事
New1
Laravel
Laravelのルートとコントローラを対応付ける方法(名前付きルート)を初心者向けに解説
New2
Symfony
Symfonyで画像やファイルをアップロードする時のバリデーション完全ガイド!初心者でもわかる入力チェックの基本
New3
Laravel
Laravelで言語切替UIを作る!多言語対応(ローカリゼーション)実践ガイド
New4
CodeIgniter
CodeIgniterでローカル開発環境を構築する方法!初心者向け完全ガイド
人気記事
No.1
Java&Spring記事人気No1
CodeIgniter
CodeIgniterのキャッシュ管理を完全ガイド!初心者でもわかるメリットと注意点
No.2
Java&Spring記事人気No2
Symfony
Symfony学習に役立つおすすめドキュメント・教材・リソース一覧【初心者向け】
No.3
Java&Spring記事人気No3
Laravel
Laravelのプロジェクト構造を理解しよう!初心者向けディレクトリ解説
No.4
Java&Spring記事人気No4
CodeIgniter
CodeIgniterとは?特徴・できること・他PHPフレームワークとの違いを完全解説
No.5
Java&Spring記事人気No5
Laravel
Laravelローカリゼーション入門!言語の取得と切り替え(App::getLocale / setLocale)を徹底解説
No.6
Java&Spring記事人気No6
CodeIgniter
CodeIgniterのビュー共通化ガイド!初心者でもわかる部分ビューの読み込みとinclude設計
No.7
Java&Spring記事人気No7
Laravel
Laravelのルーティングの基本構文と書き方をやさしく解説!初心者でも理解できるWebルートの仕組み
No.8
Java&Spring記事人気No8
Symfony
TwigのHTMLエスケープとrawフィルタの使い方を完全解説!初心者にもわかるテンプレート表示のコツ