一段使用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]
);