一段使用updateOrCreate
方法的 Laravel 代码:
TransactionJSON::updateOrCreate(
['uuid' => $json->payload->id],
['json' => $json_merge]
);
运行后报错:
"SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '8acda4a86b26d8dc016b3801b87236b0' for key 'uuid'"
很明显是唯一索引遇到了重复数据,按理说updateOrCreate
方法是不应该出现这种情况啊,因为这个方法是查询到数据就更新,不存在才创建。
仔细检查了一下数据库,发现原来是软删除带来的问题,数据库中确实存在着重复记录,不过是被软删除的。
再看了下文档,其实 Laravel 已经考虑到这种情况了,提供了一个函数:withTrashed()
,使用这个函数后程序会在查询时包含软删除模型。因此将文章开头的代码改成下面的形式就可以正确运行了:
TransactionJSON::withTrashed()->updateOrCreate(
["uuid" => $json->payload->id],
["json" => $json_merge]
);