我在理解 updateOrCreate Eloquent 方法时遇到问题。
我有一个简单的数据库,我在其中保存来自 API 的信息并每 x 分钟运行一次。
我需要做的是,如果数据库中不存在该行,则执行 INSERT,否则只需执行 UPDATE 并更新已更改的数据。
我们如何在 Laravel 中实现这个功能?
这是我现在所拥有的,但是它会在所有行中重写相同的数据。
不知道我理解的对不对。
我基本上是在传递一个“条件”,即。需要检查的字段是否唯一 - campaign_id+variation_id 应该是唯一的。 (它由 MySQL 中的 UNIQUE 键支持)和我的数据数组:
$data = [
'campaign_id' => $variation['campaign_id'],
'variation_id' => $variation['variation_id'],
'name' => $variation['name'],
'description' => $variation['description'],
];
MyModel::updateOrCreate( ['campaign_id' => $variation['campaign_id'], 'variation_id' =>
$variation['variation_id'] ], $data);
它似乎可以与查询生成器方法 updateOrInsert 一起使用,但我想用 Eloquent 实现这一点,认为这很容易。 Plus Query Builder 不会为我填写时间戳。
感谢任何提示!
最佳答案
查看Laravel的源码,updateOrCreate()
在水下使用了firstOrNew($attributes)
。
public function updateOrCreate(array $attributes, array $values = [])
{
return tap($this->firstOrNew($attributes), function ($instance) use ($values) {
$instance->fill($values)->save();
});
}
因此,当根据 $attributes
找到 1 个或多个项目时,它只会更新那些匹配项目的第一个结果。
记录您的所有查询并检查您的代码实际在做什么。 Logging queries
使用 updateOrCreate()
应该会导致 1 次选择和 1 次更新或插入查询,因此总共有 2 次。
关于mysql - Eloquent updateOrCreate() 覆盖所有行 - 试图理解它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47123273/