在我的一个工作脚本中,基于某些指标存储聚合计数,我没有使用Eloquent,因为查询有点复杂,并且使用查询构建器很容易编写。我目前从数据库中获取值,我需要在数据库中插入/更新它。使用Query Builder可以实现upsert操作是否可以使用Query Builder实现?或者我是否每次都需要检查此条目是否在数据库中?
我总共有100,000个条目,并希望将其作为日常工作运行。因此,如果我需要检查数据库中是否存在特定条目,我需要多次访问数据库。有替代解决方案吗?
我正在考虑创建两个模型类,一个使用Eloquent,另一个使用查询构建器。我可以在Eloquent模型中使用我的自定义查询吗?
答案 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,
],
);
code
和destination
搜索可能会尽力识别您的行。以下是该方法的标志。
/**
* 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');