php - 在事件监听器中同步多对多关系(Laravel 5.7)
问题描述
Laravel App 有角色,每个Role
都有权限(多对多)
每个用户都有多个角色(多对多)
当 Role 的权限发生变化/更新时,RolePermissionsChanged
会触发 Event 并且监听器具有以下代码:
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;
}
}
解决方案
$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);
});
}
推荐阅读
- ios - react-native-camera 在 iOS 中不起作用
- php - 通过大于 34 MB 的表单发送文件
- dask - 如何让所有工人在黎明时分做同样的任务?
- c# - 对谷歌正确响应的操作
- reactjs - 在 redux 状态下出现“Unexpected input given to normalize”错误消息
- excel - 使用 VBA-Excel 在 Powerpoint 幻灯片中粘贴多个形状
- oracle-apex - 基于“列表”类型的区域创建类型的区域插件
- javascript - 在同一对象中使用 JSON 对象的值和 JSON 值字符串的连接
- python - 如何在“for循环”中传递一些函数后返回相同的数据帧,而不附加等?
- arrays - 如何在VBScript中将项目添加到文件夹项目3?