Синхронизация отношений «многие ко многим» в слушателе событий (Laravel 5.7)

Laravel App имеет роли и каждый Role имеет разрешения (много ко многим)

Каждый пользователь имеет несколько ролей (от многих к многим)

Когда разрешения Роли изменены / обновлены, Событие RolePermissionsChanged срабатывает, и слушатель имеет следующий код:

public function handle(RolePermissionsChanged $event)
{
$role_permissions=$event->role()->permissions;
foreach ($event->role()->users as $user) {
$user->permissions()->sync($role_permissions);
}
}

Это должно обновить permission_user таблица для синхронизации ролей для пользователя. Когда событие инициируется, задание завершается с ошибкой:


Method Illuminate\Database\Eloquent\Collection::sync does not exist.

Если я изменю строку в foreach цикл до App\User::find($user->id)->permissions()->sync($role_permissions);, это работает, но я знаю, что это должно быть сделано другим способом. Может кто-нибудь направить, где я иду не так.

Редактировать:

Ниже RolePermissionsChanged::class

<?php

namespace App\Events\Auth;

use Illuminate\Queue\SerializesModels;
use Illuminate\Foundation\Events\Dispatchable;
use App\Role;

class RolePermissionsChanged
{
use Dispatchable, SerializesModels;

public $role;

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

}

0

Решение

$event->role() должно быть $event->roleэто публичное свойство, определенное в классе событий, где $event->role() рассматривает это как вызов функции.

public function handle(RolePermissionsChanged $event)
{
$permission_ids = $event->role->permissions->pluck('id')->toArray();

$event->role->users->each(function (User $user) use ($permission_ids) {
$user->permissions()->sync($permission_ids);
});
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]