Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Laravel. How to get id of database notification?

I use database notifications, in notification code I have method toDatabase:

public function toDatabase($notifiable)
    {
        $user = \App\SomeUsers::where('id', $notifiable->id)->first();
        return [
             'message' => $message,
        ];
    }

it returns data array which is being sent to database channel mentioned in via method of current notification:

public function via($notifiable)

    {
        return ['database'];
    }

Everything is as usual, BUT... The problem is I need id of notification in database here in current notification file so that I could broadcast message (from current notification file) to frontend which contains id of notificaion in db (so I could somehow identify it to mark as read). How to get it?

P.S. Moreover, database notification may be queueable, so... it seems that I can't get id... P.P.S Another words I need broadcast message which contains ["id" => "id of just added corresponding database notification"].

like image 389
John Smith Avatar asked May 16 '20 22:05

John Smith


People also ask

What is notify () in Laravel?

Laravel Notify is a package that lets you add custom notifications to your project.

How do I get email notifications in Laravel?

Send Email Notifications in Laravel php use App\Notifications\Newvisit; Route::get('/', function () { $user = App\User::first(); $user->notify(new Newvisit("A new user has visited on your application.")); return view('welcome'); });


2 Answers

<?php

namespace App\Notifications;

use App\Channels\SocketChannel;
use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Notification;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
use Redis;

class MyCustomNotification extends Notification implements ShouldQueue
{
    use Queueable;

    /**
     * Create a new notification instance.
     *
     * @return void
     */


    public function __construct($param)
    {
        $this->param = $param;
    }

    /**
     * Get the notification's delivery channels.
     *
     * @param  mixed  $notifiable
     * @return array
     */
    public function via($notifiable)
    {
        $channels = ['database'];
        return $channels;
    }

    /**
     * Get the mail representation of the notification.
     *
     * @param  mixed  $notifiable
     * @return \Illuminate\Notifications\Messages\MailMessage
     */
    public function toMail($notifiable)
    {

    }

    /**
     * Get the array representation of the notification.
     *
     * @param  mixed  $notifiable
     * @return array
     */
    public function toDatabase($notifiable)
    {
        info("This is the current notification ID, it's generated right here before inserting to database");
        info($this->id);
        return [

            'id'     =>  **$this->id**,
            'message' => 'Notification message',

        ];
    }


} 

$this->id solves the problem.

https://laracasts.com/discuss/channels/laravel/get-database-notification-id-in-push-notification

P.S. I want to draw attention to one fact. When I posted this question, I knew about $this->id, but I couldn't make it work. The reason was: when I dive deeper to my target code from the top level I made changes to code, but they didn't apply. The reason is queues. You need to restart laravel worker to apply settings as Laravel caches logic or you need temporarily delete those: implements ShouldQueue and use Queueable.

like image 121
John Smith Avatar answered Nov 15 '22 09:11

John Smith


In order to retrieve the actual ID of the notifications table in Laravel, you need to cast the ID column to string. First, you need to create a new model called, Notification.

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Notification extends Model
{
    /**
     * Cast variables to specified data types
     *
     * @var array
     */
    protected $casts = [
        'data' => 'array',
        'id' => 'string'
    ];
}

This way, if you retrieve the model, it will give you the actual ID of the table.

 {
        "id": "212829d6-5579-449f-a8e5-e86f0a08e0f9",
        "type": "App\\Notifications\\CronFailureNotification",
        ....
    }
like image 25
Chaprel John Villegas Avatar answered Nov 15 '22 09:11

Chaprel John Villegas