为什么 Laravel 不更新现有数据,而是不断插入新行?我的代码有问题吗?谢谢回复
我有下面要插入的数据。插入效果很好,但是当我再次运行播种器时,它不会更新包含
field
的现有数据,而是继续插入。
StudentRepresentative::upsert([
[
'field' => 'Sales Department',
'student_name' => 'Juan',
],
[
'field' => 'It Department',
'student_name' => 'Regina',
],
], ['student_name'], ['field']); // 2nd & 3rd argument, either way it's still not updating and keeps inserting
我能够重现您的问题,并最终得到以下stackoverflow。我尝试添加
id
列,如下所述,并且 upsert
按预期工作。我无法解释它是如何工作的,但我希望来自以下来源的以下声明可以帮助您。
Upsert 是单词 insert 和 update 的合并。如果对象具有外部 ID 字段或具有 idLookup 字段属性的字段,则此调用可用于对象。
https://developer.salesforce.com/docs/atlas.en-us.api.meta/api/sforce_api_calls_upsert.htm
试试这个,希望它对你也有用。
StudentRepresentative::upsert([
[
'id' => 1,
'field' => 'Sales Department',
'student_name' => 'Juan',
],
[
'id' => 2,
'field' => 'It Department',
'student_name' => 'Regina',
],
], ['id', 'field']);
您错过了函数中的第二个参数,其中至少定义了要更新的唯一标识符列(如果存在)。
StudentRepresentative::upsert([
[
'field' => 'Sales Department',
'student_name' => 'Juan',
],
[
'field' => 'It Department',
'student_name' => 'Regina',
],
],['student_name'], ['field']);
为了使 upsert 正常工作,您的数据库中需要有相关索引。该索引必须与 Upsert 语句中的第二个参数完全相同。如果有多个字段,则需要复合索引。在您的情况下,您需要在
student_name
上创建唯一索引。
将此添加到您的迁移中:
$table->unique('student_name');
然后再试一次。