Laravel eloquent upsert 不更新?

问题描述 投票:0回答:3

为什么 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
laravel eloquent
3个回答
1
投票

我能够重现您的问题,并最终得到以下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']);

0
投票

您错过了函数中的第二个参数,其中至少定义了要更新的唯一标识符列(如果存在)。

StudentRepresentative::upsert([
            [
                'field' => 'Sales Department',
                'student_name' => 'Juan',
            ],
            [
                'field' => 'It Department',
                'student_name' => 'Regina',
            ],
        ],['student_name'], ['field']);

0
投票

为了使 upsert 正常工作,您的数据库中需要有相关索引。该索引必须与 Upsert 语句中的第二个参数完全相同。如果有多个字段,则需要复合索引。在您的情况下,您需要在

student_name
上创建唯一索引。

将此添加到您的迁移中:

$table->unique('student_name');

然后再试一次。

© www.soinside.com 2019 - 2024. All rights reserved.