firstOrCreate() 与 createOrFirst()
上次更新于 作者: Eric L. Barnes
Laravel v10.20 推出了一个全新的方法 createOrFirst()
,由 Tony Messias 贡献,这可能有点令人困惑,因为 Laravel 已经有一个 firstOrCreate()
。它们之间有什么区别?为什么我们需要两种方法?让我们来看看...
createOrFirst()
新的 createOrFirst()
方法旨在在高并发环境中表现更好,并有助于减少竞争条件,但需要数据库上存在唯一的约束。
使用
createOrFirst
,我们颠倒了这个流程,并依赖于表具有UNIQUE
约束。因此,首先,我们尝试创建记录,如果从数据库收到异常并识别出它是唯一约束冲突,我们将尝试查找匹配的记录。这样,并发进程就可以依赖于数据库的 ACID 特性,并且永远不必再担心竞争条件。
您可以在 拉取请求 上找到更多详细信息。
firstOrCreate()
firstOrCreate
是最初的方法,以下是它在文档中的定义方式
firstOrCreate 方法将尝试使用给定的列/值对定位数据库记录。如果模型在数据库中找不到,将使用第一个数组参数与可选的第二个数组参数合并后产生的属性插入记录。
这个新方法的另一个优点是,现在原始的 firstOrCreate
方法在幕后使用新的 createOrFirst
方法。因此,它按照以下步骤进行:
- 尝试查找
- 如果丢失,尝试创建
- 如果发生 UNIQUE 冲突,尝试再次查找,因为我们遇到了竞争条件
使用哪个?
我想说,在大多数应用程序中,原始的 firstOrCreate
就足够了,只有在您处于高并发环境中,流量很大时,才需要使用 createOrFirst
。
相关: Laravel firstOrNew、firstOrCreate、firstOr 和 updateOrCreate 方法。