Larave 6 - синхронизация сводной таблицы c - запускать созданное событие, только если присоединенный пользователь новый - PullRequest
0 голосов
/ 16 июня 2020

У меня есть следующий код:

$clinic->users()->sync($sync);

Что будет go для этого класса (syn c работает):

<?php

namespace App;

use Illuminate\Database\Eloquent\Relations\Pivot;

class ClinicUser extends Pivot
{
    protected $table = 'clinic_user';

    static function boot()
    {
        parent::boot();

        static::created(function($item) {

            $user   = \App\User::find($item->users_id);
            $clinic = \App\Models\Clinic::find($item->clinics_id);

            if($user->userData->notification_email == 1)
                \Mail::to($user->email)->send(new \App\Mail\ClinicManagerAdded(
                    $user,
                    $clinic));

            if($user->userData->notification_app == 1)
                \App\Notification::create([
                    'title'   => "message",
                    'body'    => "message",
                    'user_id' => $user->id,
                ]);

        });
    }
}

Можно ли запустить созданный метод только для новых пользователей (не отключенных)?

Ответы [ 2 ]

1 голос
/ 16 июня 2020

То, что я предлагал, не так уж и надежно, на самом деле вам нужно делать

$clinic->users()->detach($sync->pluck('id'));
$clinic->users()->sync($sync);

Каждый раз, и вам нужно помнить об этом (и поэтому не надежно).

Я чувствую, что предлагаю вам сделать что-то вроде этого:

  1. Удалить уведомление в модели
  2. Создайте службу для этой операции, назовем ее NotyfyUsersNewClinicService (возможно, вы найдите имя получше):
<?php

namespace App;
use ...;

class NotyfyUsersNewClinicService{

    public __constructor(){}

    public updateUsers(Clinic& $clinic, Collection& $newUsers){
       $clinic->users->diff($newUsers)->each(function(User $users){
           $user->userData->notification_email = true;
           \Mail::to($user->email)->send(new \App\Mail\ClinicManagerAdded(
                    $user,
                    $clinic));
       });
       $clinic->users()->sync($sync);
    }
}

, тогда вам нужно будет использовать только это:

(new NotyfyUsersNewClinicService ()) -> updateUsers ($ clini c, $ users);

Примечание: лучше, если вы переместите электронное письмо в задание и отправите его, используя queue:work

0 голосов
/ 16 июня 2020

Если у кого-то есть похожая проблема, мне удалось решить ее, создав переменную stati c и заполнив эту переменную в событии удалено , например:

<?php

namespace App;

use Illuminate\Database\Eloquent\Relations\Pivot;

class ClinicUser extends Pivot
{
    protected $table = 'clinic_user';

    static $ids = [];

    static function boot()
    {
        parent::boot();

        static::deleted(function($item){
           self::$ids[] = $item->users_id;
        });

        static::created(function($item){

            if(!\in_array($item->users_id, self::$ids)){
                $user   = \App\User::find($item->users_id);
                $clinic = \App\Models\Clinic::find($item->clinics_id);

                if($user->userData->notification_email == 1)
                    \Mail::to($user->email)->send(new \App\Mail\ClinicManagerAdded(
                        $user,
                        $clinic));

                if($user->userData->notification_app == 1)
                    \App\Notification::create([
                        'title'   => "new message",
                        'body'    => "<p>body</p>",
                        'user_id' => $user->id,
                    ]);
            }


        });
    }
}
...