Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel-在已保存的事件中保存许多相关模型不适用于更新_Php_Laravel_Foreign Keys - Fatal编程技术网

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