Php 在事件侦听器中同步多对多关系(Laravel 5.7)

Php 在事件侦听器中同步多对多关系(Laravel 5.7),php,laravel,relationship,eloquent-relationship,Php,Laravel,Relationship,Eloquent Relationship,Laravel应用程序有角色,每个角色都有权限(多对多) 每个用户都有多个角色(多对多) 更改/更新角色权限时,会触发事件RolePermissionsChanged,侦听器具有以下代码: public function handle(RolePermissionsChanged $event) { $role_permissions=$event->role()->permissions; foreach ($event->role()->users

Laravel应用程序有角色,每个角色都有权限(多对多)

每个用户都有多个角色(多对多)

更改/更新角色权限时,会触发事件
RolePermissionsChanged
,侦听器具有以下代码:

public function handle(RolePermissionsChanged $event)
{
     $role_permissions=$event->role()->permissions;
     foreach ($event->role()->users as $user) {
        $user->permissions()->sync($role_permissions);
      }
}
这必须更新
permission\u user
表才能将角色同步到用户。触发事件时,作业将失败并出现错误:


方法Illumb\Database\Eloquent\Collection::sync不存在。

如果我将
foreach
循环中的行更改为
App\User::find($User->id)->permissions()->sync($role\u 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;
    }

}
$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);
    });
}

你能把你的
RolePermissionsChanged
类的代码添加到你的问题中吗?@RossWilson补充道:
$event->role()
从哪里来,因为我在你的
RolePermissionsChanged
类中没有看到
RolePermissionsChanged
方法?我想问题是
$event->role())
将返回一个集合实例,而
foreach($event->role->users as$user)
这应该可以工作。它将作为
App\role:class
的实例传递,如Laravel文档中所述。我删除了我的答案。我认为这应该被接受。只需更改一下:
$user->permissions->sync($permissions\u id)谢谢,是的,这适用于编辑。:)谢谢两位