php - 使用 Laravel eloquent 更新或创建数据透视表条目时避免唯一约束异常
问题描述
我有两个表user,group和一个中间数据透视表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。
我已经仔细检查了建议的类似问题,我相信它们并不能完全反映我的情况。
解决方案
推荐阅读
- mysql - 谷歌云 MYSQL 实例的用户 'root'@'%' 访问被拒绝(使用密码:YES)
- nginx - linux上nginx上配置域名?
- sql - psql -c 传入json数据
- php - PHP / Docusign - 验证已完成事件的 HMAC 签名
- python - 检查变量名中是否存在子字符串 - Python
- python - 调用计数不适用于异步功能
- firebase - 如何租用和使用自己的服务器来实现云功能?
- javascript - JavaScript currying:返回在当前函数之外定义的函数
- mysql - 使用 slashdb rest api 将 json 数据插入 MySQL 数据库
- sql - 如何从 Oracle 中的 XMLType 列中提取特定节点的所有子节点的值(通过输入参数提供)