php - Laravel Eloquent,如何处理 UNIQUE 错误?
问题描述
我有一个 MySQL 约束来确保复合键的唯一性。在我的模型中插入新记录时,我Foo
得到了预期的错误:
$foo = new Foo(['foo' => 42, 'bar => 1]);
$foo->save();
错误:
SQLSTATE [23000]:违反完整性约束:1062 键 'Unique' 的重复条目 '42'...
避免此错误的一种解决方案是在插入之前查询模型:
if (!Foo::where('foo', 42)->where('bar', 1)->first()) {
$foo = new Foo(['foo' => 42, 'bar => 1]);
$foo->save();
}
preg_match(/UNIQUE/, $e->message)
另一种方法是在is时捕获异常true
。
有没有更好的解决方案?
编辑
我注意到在Illuminate\Database\Eloquent\Builder
Laravel 中无论如何都会进行双重查询,这有点令人难过:
public function findOrNew($id, $columns = ['*'])
{
if (! is_null($model = $this->find($id, $columns))) {
return $model;
}
return $this->newModelInstance();
}
解决方案
在一般情况下,您应该使用错误代码而不是任何正则表达式来处理数据库错误。
在您的特定情况下,如果您的意图是覆盖/更新现有数据,则预查询或使用自动为您执行此操作的 Laravel 方法可能更可取。
如果您想普遍预测错误并处理它,您应该执行以下操作:
try {
$foo = new Foo(['foo' => 42, 'bar' => 1]);
$foo->save();
} catch (\Exception $e) { // It's actually a QueryException but this works too
if ($e->getCode() == 23000) {
// Deal with duplicate key error
}
}
请参阅https://dev.mysql.com/doc/refman/5.5/en/error-reference.html以获取详尽的错误代码列表(但理想情况下,您只需要处理几个特定的错误并在非常具体的情况。
最后,SQLON DUPLICATE KEY UPDATE
也可能对您有用,但是如果您这样做是为了默默地忽略新值,那么我建议您改为进行错误处理。
推荐阅读
- android - 3D 模型未在 Android 设备上加载
- python - SqlAlchemy 中的查询对象是不可变的吗?
- excel - 当从另一个模块/子调用子时,应用程序警报/警告不会被抑制
- web - 网站错误社交媒体链接“拒绝连接”
- python - mod_wsgi:将数据代理到守护进程时请求数据读取错误
- javascript - 如何使用angular8使数据列表从一个数组移动到另一个数组
- sql-server - 在 SQL Server 中 - 如何列出所有与外键相关的表和字段?
- javascript - 检查是否在量角器中选择了选择字段
- makefile - 从另一个 cmake 文件在 cmake 中运行 make install 命令
- maven - Quarkus:尝试使用多阶段 docker build 缓存 maven 依赖项