Php Laravel-在已保存的事件中保存许多相关模型不适用于更新
我有三种模型来管理应用程序中的角色:Php Laravel-在已保存的事件中保存许多相关模型不适用于更新,php,laravel,foreign-keys,Php,Laravel,Foreign Keys,我有三种模型来管理应用程序中的角色:Role、User、UserRole 在用户模型类中,有一个具有多个关系,在数据库中,用户角色相关表中的用户代码字段中有一个外键: public function userRoles(): HasMany { return $this->hasMany('App\Models\UserRole', 'user_code', 'code'); } 保存用户模型后,我有一种分配角色的方法: public function assignRole(..
Role
、User
、UserRole
在用户
模型类中,有一个具有多个
关系,在数据库中,用户角色
相关表中的用户代码
字段中有一个外键:
public function userRoles(): HasMany
{
return $this->hasMany('App\Models\UserRole', 'user_code', 'code');
}
保存用户模型后,我有一种分配角色的方法:
public function assignRole(...$roles)
{
$userRoles = collect($roles)->flatten()->map(function($role) {
return new UserRole(['code' => $role instanceof Role ? $role->code: $role]);
});
$this::saved(
function ($object) use ($userRoles) {
$object->userRoles()->delete();
$object->userRoles()->saveMany($userRoles);
$object->load('userRoles');
}
);
return $this;
}
在UserController
中有一个更新操作,用于将角色更改为用户
:
public function update(UpdateUser $request, User $user)
{
$data = $request->all();
$user->fill($data);
$user->assignRole($data['roles']);
if (!$user->save()) {
...
问题是,当我更新$user
时,我得到一个异常:
照亮\数据库\查询异常
SQLSTATE[23503]:外键冲突
这是由$object->userRoles()->saveMany($userRoles)引起的代码>在已保存的事件中
我认为这是因为当它保存相关模型时,更新的$user
未保存到数据库中,并且user\u code
上的外键约束被违反。但是保存的事件回调**在创建**用户模型上运行良好。为什么?我该如何解决呢?使用$this::saved(
的部分对我来说毫无意义。你想实现什么?你可能需要一个模型观察者:
您的$this::saved()
调用saveMany()
,反过来触发$this::saved()
事件“多次”,然后调用saveMany()
一次又一次。您似乎处于一个无限循环中,当您遇到外键约束时,循环就结束了。停止手动触发您的角色更新,只需使用观察者来处理它
在App\Providers\AppServiceProvider.php:boot()
:
\App\Models\User::已保存(函数($User){
$userRoles=collect($roles)->flant()->map(函数($role){
返回新用户角色(['code'=>role的$role实例?$role->code:$role]);
});
$user->userRoles()->delete();
$user->userRoles()->saveMany($userRoles);
$user->load('userRoles');
});
您是否只测试了$object->userRoles()->delete();
行以查看删除是否有效?此外,错误消息是否显示更多(可能有用)信息?delete()关系正常,错误消息是SQLSTATE外键冲突的标准。@alvarofvr请发布您的迁移。一定是角色输入错误。您可以dd()吗$roles在assignRole function的开头我到目前为止还没有使用迁移。您好@13h50,$this::saved只是一个事件,我想在保存用户模型时触发保存用户角色模型。这很清楚,没有循环XD