Skip to main content
Version: 2.x

Database notifications

To start, make sure the package is installed - @livewire('notifications') should be in your Blade layout somewhere.

Before we start, make sure that the Laravel notifications table is added to your database:

php artisan notifications:table

If you're using PostgreSQL, make sure that the data column in the migration is using json(): $table->json('data').

If you're using UUIDs for your User model, make sure that your notifiable column is using uuidMorphs(): $table->uuidMorphs('notifiable').

First, you must publish the configuration file for the package.

Inside the configuration file, there is a database key. To enable database notifications:

'database' => [
'enabled' => true,
// ...
],

Database notifications will be rendered within a modal. To open this modal, you must have a "trigger" button in your view. Create a new trigger button component in your app, for instance at /resources/views/notifications/database-notifications-trigger.blade.php:

<button type="button">
Notifications ({{ $unreadNotificationsCount }} unread)
</button>

$unreadNotificationsCount is a variable automatically passed to this view, which provides it with a real-time count of the number of unread notifications the user has.

In the configuration file, point to this new trigger view:

'database' => [
'enabled' => true,
'trigger' => 'notifications.database-notifications-trigger',
// ...
],

Now, simply move the @livewire('notifications') component to the position in your HTML that you wish to render the database notifications trigger button. It should appear, and open the database notifications modal when clicked!

Sending notifications​

There are several ways to send database notifications, depending on which one suits you best.

You may use our fluent API:

use Filament\Notifications\Notification;

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

Notification::make()
->title('Saved successfully')
->sendToDatabase($recipient);

Or, use the notify() method:

use Filament\Notifications\Notification;

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

$recipient->notify(
Notification::make()
->title('Saved successfully')
->toDatabase(),
);

Alternatively, use a traditional Laravel notification class by returning the notification from the toDatabase() method:

use App\Models\User;
use Filament\Notifications\Notification;

public function toDatabase(User $notifiable): array
{
return Notification::make()
->title('Saved successfully')
->getDatabaseMessage();
}

Receiving notifications​

Without any configuration, new database notifications will only be received when the page is first loaded.

Polling​

Polling is the practice of periodically making a request to the server to check for new notifications. This is a good approach as the setup is simple, but some may say that it is not a scalable solution as it increases server load.

By default, the configuration file polls for new notifications every 30 seconds:

'database' => [
'enabled' => true,
'polling_interval' => '30s',
// ...
],

You may completely disable polling if you wish:

'database' => [
'enabled' => true,
'polling_interval' => null,
// ...
],

Echo​

Alternatively, the package has a native integration with Laravel Echo. Make sure Echo is installed, as well as a server-side websockets integration like Pusher.

Once websockets are set up, after sending a database notification you may emit a DatabaseNotificationsSent event, which will immediately fetch new notifications for that user:

use Filament\Notifications\Events\DatabaseNotificationsSent;
use Filament\Notifications\Notification;

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

Notification::make()
->title('Saved successfully')
->sendToDatabase($recipient);

event(new DatabaseNotificationsSent($recipient));

Opening the notifications modal​

Instead of rendering the trigger button as described above, you can always open the database notifications modal from anywhere by dispatching an open-modal browser event:

<button
x-data="{}"
x-on:click="$dispatch('open-modal', { id: 'database-notifications' })"
type="button"
>
Notifications
</button>