Laravel使用Query Builder进行upsert操作

时间:2016-06-10 06:04:16

标签: laravel laravel-5 eloquent query-builder laravel-query-builder

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

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

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

3 个答案:

答案 0 :(得分:6)

Eloquent拥有updateOrCreate()方法,可让您完全按照自己的意愿行事。但是查询生成器没有类似的方法。

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

答案 1 :(得分:1)

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 = [])

答案 2 :(得分:1)

现在,Laravel具有本机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');