How to Save Notifications in the Database in Laravel

 How to Save Notifications in the Database in Laravel

Laravel provides a built-in way to store notifications in the database using the database channel. Here’s how you can set it up.


1. Create the Notifications Table

Laravel comes with a built-in migration for notifications. If you haven’t migrated it yet, run:


php artisan notifications:table php artisan migrate

This will create a notifications table in your database with fields like:

  • id (unique identifier)
  • type (notification class)
  • notifiable_id & notifiable_type (user or model that received the notification)
  • data (JSON field storing notification details)
  • read_at (timestamp for when the notification is read)

2. Update Your Notification Class

Modify your CommentAddedNotification to use the database channel and store data.

Example: app/Notifications/CommentAddedNotification.php

namespace App\Notifications;
use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Notifications\Notification; class CommentAddedNotification extends Notification implements ShouldQueue { use Queueable; protected $task; protected $comment; public function __construct($task, $comment) { $this->task = $task; $this->comment = $comment; } // Define which channels the notification should be sent through public function via($notifiable): array { return ['database']; // Store the notification in the database } // Define the data that should be stored in the database public function toArray($notifiable): array { return [ 'task_id' => $this->task->id, 'task_title' => $this->task->title, 'comment' => $this->comment, 'commented_by' => auth()->user()->name, 'created_at' => now(), ]; } }

3. Send the Notification

You can send the notification to a user like this:


$user->notify(new CommentAddedNotification($task, $comment));

Alternatively, you can use the Notification facade:

use App\Notifications\CommentAddedNotification;
use Illuminate\Support\Facades\Notification; Notification::send($user, new CommentAddedNotification($task, $comment));

4. Retrieve Stored Notifications

In your controller or view, fetch the user’s notifications:

php
$notifications = auth()->user()->notifications; // Get all notifications

If you only want unread notifications:


$unreadNotifications = auth()->user()->unreadNotifications;

5. Mark Notifications as Read

Once a user views the notification, mark it as read:


auth()->user()->unreadNotifications->markAsRead();

To mark a specific notification as read:


$notification = auth()->user()->notifications()->find($notificationId); if ($notification) { $notification->markAsRead(); }

6. Display Notifications in Blade

Example: Showing Notifications in a Dashboard

In resources/views/notifications.blade.php:


<ul> @foreach(auth()->user()->notifications as $notification) <li> <strong>{{ $notification->data['task_title'] }}</strong> - {{ $notification->data['comment'] }} (by {{ $notification->data['commented_by'] }}) <small>{{ $notification->created_at->diffForHumans() }}</small> @if(!$notification->read_at) <form method="POST" action="{{ route('notifications.read', $notification->id) }}"> @csrf <button type="submit">Mark as Read</button> </form> @endif </li> @endforeach </ul>

7. Create a Route and Controller Method

In routes/web.php:


use App\Http\Controllers\NotificationController; Route::post('/notifications/read/{id}', [NotificationController::class, 'markAsRead'])->name('notifications.read');

In app/Http/Controllers/NotificationController.php:


namespace App\Http\Controllers; use Illuminate\Http\Request; class NotificationController extends Controller { public function markAsRead($id) { $notification = auth()->user()->notifications()->find($id); if ($notification) { $notification->markAsRead(); } return back(); } }

Summary

  1. Migrate the notifications table (php artisan notifications:table && php artisan migrate).
  2. Update the notification class to use the database channel and store data.
  3. Send notifications to users ($user->notify(new CommentAddedNotification($task, $comment))).
  4. Retrieve notifications in a controller (auth()->user()->notifications).
  5. Mark notifications as read using markAsRead().

Now, notifications will be stored in the database and can be displayed in the UI! 🚀 Let me know if you need further customization.

Comments

Popular posts from this blog

Use the Google Custom Search JSON API to retrieve images

Terminal commands relared to files in the Ubuntu

Development-Testing Workflow