首页 > 解决方案 > 使用 Laravel eloquent 更新或创建数据透视表条目时避免唯一约束异常

问题描述

我有两个表usergroup和一个中间数据透视表user_group。user_group 表有四个属性user_id、group_id、count 和recorded_at。我为 user_group 的 user_id、group_id、recorded_at 组合设置唯一约束。如果数据透视表中不存在user_id、group_id、recorded_at组合,我正在尝试向user_group表插入新数据。

$user->groups()->save($group[0], ['count' => $request->count, 'recorded_at' => now()]); 
\\ This line works for inserting new data when the user_group table has no entry for user_id, group_id, recorded_at combination

当有唯一组合的条目时,我会收到 QueryException,因为前一个代码块的唯一约束失败。

lluminate\Database\QueryException #23000
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '7-52-2020-09-20' for key 'group_user_group_id_user_id_recorded_at_unique' (SQL: insert into `group_user` (`count`, `group_id`, `recorded_at`, `user_id`) values (0, 7, 2020-09-20 08:54:22, 52))

如果条目存在,我需要更新计数列。为此,我尝试遵循代码块。

try{
     $user->groups()->save($group[0], ['count' => $request->count, 'recorded_at' => now()]);
}catch(QueryExceptoin $ex){
     $user->groups()->updateExistingPivot($group[0], ['count' => $request->count, 'recorded_at' => now()]);
}

此块尝试捕获是否存在唯一组合条目,然后尝试更新所需的计数列。但是,此代码无法捕获查询异常,因此我的更新失败。我有两个问题。1)有没有更好的方法来实现我想要实现的目标?2)为什么try catch不能捕获查询异常,如何让它捕获?

我正在使用 Laravel 8 和 PHP 7.4.5。

我已经仔细检查了建议的类似问题,我相信它们并不能完全反映我的情况。

标签: phpmysqllaravelerror-handlingeloquent

解决方案


推荐阅读