【发布时间】:2019-06-01 06:04:47
【问题描述】:
Laravel App 有角色,每个Role 都有权限(多对多)
每个用户都有多个角色(多对多)
当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;
}
}
【问题讨论】:
-
您能否将
RolePermissionsChanged课程的代码添加到您的问题中? -
@RossWilson,已添加。
-
$event->role()来自哪里,因为我在RolePermissionsChanged类中没有看到role()方法? -
我认为问题是
$event->role()将返回一个 Collection 实例,而foreach ($event->role->users as $user)这应该可以工作。 -
它作为
App\Role:class的实例传递,如 Laravel 文档中所述。 laravel.com/docs/5.7/events#defining-listeners
标签: php laravel relationship eloquent-relationship