Laravel change Connection for Notifications table

前端 未结 3 1742
鱼传尺愫
鱼传尺愫 2021-01-13 19:39

I am implementing Laravel 5.3 Notifications at the moment which is working very nice.

At the moment I am using \'email\' as a notifications channel but I want to add

相关标签:
3条回答
  • On Laravel 5.7 based on @Bernard answer

    User.php

    <?php
    
    namespace App;
    
    // implement the override Notifiable trait
    use App\Traits\Override\Notifiable;
    use Illuminate\Foundation\Auth\User as Authenticatable;
    
    class User extends Authenticatable
    {
        use Notifiable;
    }
    

    Notifiable.php

    <?php
    
    namespace App\Traits\Override;
    
    use Illuminate\Notifications\RoutesNotifications;
    
    trait Notifiable
    {
        use HasDatabaseNotifications, RoutesNotifications;
    }
    

    HasDatabaseNotifications.php

    <?php
    
    namespace App\Traits\Override;
    
    use App\Models\Override\MultiConnectionDatabaseNotification;
    
    trait HasDatabaseNotifications
    {
        /**
         * Get the entity's notifications.
         *
         * @return \Illuminate\Database\Eloquent\Relations\MorphMany
         */
        public function notifications()
        {
            return $this->morphMany(MultiConnectionDatabaseNotification::class, 'notifiable')->orderBy('created_at', 'desc');
        }
    
        /**
         * Get the entity's read notifications.
         *
         * @return \Illuminate\Database\Query\Builder
         */
        public function readNotifications()
        {
            return $this->notifications()->whereNotNull('read_at');
        }
    
        /**
         * Get the entity's unread notifications.
         *
         * @return \Illuminate\Database\Query\Builder
         */
        public function unreadNotifications()
        {
            return $this->notifications()->whereNull('read_at');
        }
    }
    

    MultiConnectionDatabaseNotification.php

    <?php
    
    namespace App\Models\Override;
    
    use Illuminate\Notifications\DatabaseNotification as DatabaseNotification;
    
    class MultiConnectionDatabaseNotification extends DatabaseNotification
    {
        // set your preferred connection here
        protected $connection = 'oracle';
    }
    
    0 讨论(0)
  • 2021-01-13 20:32

    It's pretty simple, Just add protected $connection = 'YOUR CONNECTION NAME'; at Illuminate\Notifications\DatabaseNotification

    That's all and it will work :)

    You don't need to create new models if you are going to use one notification table with same connection.

    My code will works if ur using different connection for USER model.

    0 讨论(0)
  • 2021-01-13 20:45

    Hackish solution. But tried and tested on a MongoDB connection.

    What needs to be modified;

    1. The Notifiable trait
    2. The DatabaseNotification model
    3. Optionally (nothing changes if you are using mysql) modify the HasNotifications trait
    4. Modify the DatabaseNotificationCollection.Again this is useful for a non-mysql connection

    Step One : Create a custom Notifiable Trait

    Copy the contents from Illuminate\Notifications\Notifiable and create a new file in your custom path...say App\Overrides\Notifications\Notifiable.

    Your file will feature two changes...the namespace and you have to load the RoutesNotifications trait since we are not copying it over.

    <?php
    
    namespace App\Overrides\Notifications;
    
    use use Illuminate\Notifications\RoutesNotifications;
    
    trait Notifiable{
     //The rest of the code remains
    }
    

    Step Two : Create a custom DatabaseNotification model

    Follow the same procedure as above and copy the contents of the Illuminate\Notifications\DatabaseNotification file to the custom path that we created above...App\Overrides\Notification\DatabaseNotification

    This is a standard Eloquent model and the connection change actually happens here

    <?php
    
    namespace App\Overrides\Notification;
    
    //Use this if on mongodb.otherwise use to Illuminate\Database\Eloquent\Model
    use Jenssegers\Mongodb\Eloquent\Model;
    use Illuminate\Notifications\DatabaseNotificationCollection;
    
    class DatabaseNotification extends Model
    {
      protected $connection = 'YOUR_CONNECTION_NAME_GOES HERE'; 
    }
    

    As of this point this should work if you are on a mysql connection.

    To try this out change the Notifiable trait on the user model to use App\Overrides\Notifications\Notifiable. The notifications will use the connection you specified.

    Users of MongoDB will have to take extra steps since the most popular driver I know of does not yet support MorphMany relations which are put to use for Laravel notifications.

    Since that is not the asked question we leave it at that :-)

    0 讨论(0)
提交回复
热议问题