在Laravel 5.1中,对于MySQL插入,我想查看记录是否已经存在并在重复时更新,或者如果不存在则创建新的 .
我已经搜索了那里的答案是旧的laravel版本 . 在其中一个老话题中,它说去年在核心中添加了一个新的 updateOrCreate()
方法 . 但是当我尝试这个时,我收到了错误:
Integrity constraint violation: 1062 Duplicate entry '1' for key 'app_id'
这是我使用的查询:
AppInfo::updateOrCreate(array(
'app_id' => $postData['appId'],
'contact_email' => $postData['contactEmail']
));
其中 app_id
是该表中的唯一外键,我想更新记录(如果存在)或创建新记录 . 我试过搜索5.1文档但找不到我需要的信息 . 有人可以在这里指导我吗...
5 回答
根据Eloquent模型方法的定义“updateOrCreate()”
需要两个论点......
one是要在数据库中检查的属性(如果记录存在)
秒是您要创建或更新的新属性值
我正在回答这个问题因为我找不到任何与ON DUPLICATE KEY UPDATE相关的答案,虽然我使用 Laravel 5.4 . 如果您查看Laravel核心代码中的updateOrCreate方法,您将看到所有Laravel使用2个不同的查询后:一个用于更新,另一个用于create . 因此,有时您可以在数据库中获取重复数据 . 所以在某些情况下,编写这种原始查询会很有用:
希望它对某人有用 .
我创建了一个包,用于在重复键上插入MySQL .
它可能对其他人有用:
https://packagist.org/packages/yadakhov/insert-on-duplicate-key
例:
要使用laravel函数 updateOrCreate ,您需要在表中自动 increment id .
他们在做什么
select id from your_table where your_attributes
之后获得自动增量ID
然后
update your_table set your_values where field_id
将以下方法insertUpdate添加到模型中
您可以使用:
它将执行的下一个查询:
如果已启用或禁用,该方法会自动添加/删除Eloquent时间戳 .