Laravel 使用查询生成器更新插入操作

Laravel upsert operations with Query Builder

在我的一个基于某些指标存储聚合计数的工作脚本中,我没有使用 Eloquent,因为查询有点复杂,而且使用查询生成器很容易编写。我目前正在从数据库中获取值,我需要在数据库中 insert/update 它。使用 save() 方法是否可以使用 Query Builder 实现更新插入操作?还是我每次都需要检查这个条目是否在数据库中?

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

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

Eloquent 有 updateOrCreate() 方法可以让你做你想做的事。但是Query Builder没有类似的方法。

您可以使用查询生成器构建原始查询并使用 INSERT ... ON DUPLICATE KEY UPDATE 作为更新插入解决方案。

Eloquent 有一个名为 updateOrCreate 的方法,可以像这个例子一样使用:

<?
$flight = Flight::updateOrCreate(
    [
       'code' => '156787', 
       'destination' => 'COL'
    ],
    [
       'code' => '156787', 
       'destination' => 'COL',
       'price' => 99, 
       'discounted' => 1,
    ],
);
  1. codedestination 搜索可以最好地识别您的行。
  2. 它根据第二个数组中给定的值创建或更新。

下面是方法的符号

/**
 * Create or update a record matching the attributes, and fill it with values.
 *
 * @param  array  $attributes
 * @param  array  $values
 * @return \Illuminate\Database\Eloquent\Model
 */
public function updateOrCreate(array $attributes, array $values = [])

现在(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');