【问题标题】:Error on delete voyager role it is already assigned to user删除已分配给用户的航海者角色时出错
【发布时间】:2020-02-21 12:02:59
【问题描述】:

我正在使用 voyager 管理面板。 我正在尝试删除已分配给用户的权限角色,然后 voyager 给我一个错误:

2020-02-19 11:07:56] local.ERROR: SQLSTATE[23000]: 完整性 违反约束:1451 无法删除或更新父行:a 外键约束失败 (data_base_name.users, CONSTRAINT users_role_id_foreign 外键 (role_id) 引用 roles (id)) (SQL: 从roles 中删除id = 4)

voyager 应该向我显示角色无法删除其分配给用户的消息。

【问题讨论】:

  • 我不明白这个问题:你期望一个错误,这就是你得到的。有什么问题?
  • 错误信息不是说的很清楚吗?它表示不能删除角色,因为这会违反用户表上的约束? users表上的role_id字段可能不能为空?因此无法删除该角色,因为它需要将该字段设置为 null,或者需要删除所有具有 role_id=4 的用户(我也不是您想要的)
  • @mtholen 所以这是迁移问题,我们应该需要从迁移中删除删除级联?
  • @shazimali 我无法就此提供建议,因为我没有足够的信息来判断您是否应该删除级联。那不是问题吗?返回一条错误消息,正确识别问题,由您决定如何处理该消息?

标签: php laravel


【解决方案1】:
public function destroy(Request $request, $id)
{
    try {
        return parent::destroy($request, $id);
    } catch (QueryException $exception) {
        $message = $exception->getMessage();
        if (strpos($message, 'foreign key constraint') !== false) {
            $message = "This row can't be deleted";
        }

        return back()->with(['message' => $message]);
    }
}

【讨论】:

    【解决方案2】:

    您需要try-catch 来处理这样的事情。由于它是分配给另一条记录的外键,因此预期行为无法删除它。

    由于您根据错误创建消息,因此您应该执行以下操作:

    try { 
      //query goes here
    } catch(\Exception $e){ 
     $error = $e->getMessage();
     return $error;
    }
    

    【讨论】:

    • 是的,但不是更简短。
    • 什么意思?您始终可以自己返回自定义响应,例如:return response()->json('Role is already assigned to a user',403); 而不是返回错误消息
    猜你喜欢
    • 2015-12-17
    • 2012-01-19
    • 2023-02-14
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 1970-01-01
    • 2021-10-19
    相关资源
    最近更新 更多