Laravel使用Query Builder进行upsert操作

Hap*_*der 7 query-builder laravel eloquent laravel-5 laravel-query-builder

在我的一个工作脚本中,基于某些指标存储聚合计数,我没有使用Eloquent,因为查询有点复杂,并且使用查询构建器很容易编写.我目前从数据库中获取值,我需要在数据库中插入/更新它.使用Query Builder可以实现upsert操作是否可以使用Query Builder实现?或者我是否每次都需要检查此条目是否在数据库中?

我总共有100,000个条目,并希望将其作为日常工作运行.因此,如果我需要检查数据库中是否存在特定条目,我需要多次访问数据库.有替代解决方案吗?

我正在考虑创建两个模型类,一个使用Eloquent,另一个使用查询构建器.我可以在Eloquent模型中使用我的自定义查询吗?

Ale*_*nin 9

Eloquent有一个updateOrCreate()方法,可以让你完全想要你想要的.但是Query Builder没有类似的方法.

您可以使用Query Builder构建原始查询,并使用INSERT ... ON DUPLICATE KEY UPDATE作为upsert解决方案.

  • 我为所有数据库创建了一个 UPSERT 包:https://github.com/staudenmeir/laravel-upsert (4认同)
  • 请注意,“ updateOrCreate”并不像SQL upsert那样原子:https://github.com/illuminate/database/blob/2656d7a7118a6d9fe1f8c9ed22d65ab609b8ae1d/Eloquent/Builder.php#L391。它首先选择,然后插入或更新,这很容易出现竞争状况。 (2认同)

bai*_*yao 6

现在(2020 年 10 月 6 日),Laravel(v8.10.0) 有了原生upsert支持。https://github.com/laravel/framework/pull/34698

DB::table('users')->upsert([
    ['id' => 1, 'email' => 'taylor@example.com'],
    ['id' => 2, 'email' => 'dayle@example.com'],
], 'email');
Run Code Online (Sandbox Code Playgroud)

  • @HappyCoder 不管这个问题有多老,如果你有话要说。这会对偶然发现你的问题的人有所帮助。 (10认同)
  • 感谢您检查这一点。我4年前就问过这个问题了。 (3认同)