【问题标题】:Laravel updateOrCreate with composite keyLaravel updateOrCreate 使用复合键
【发布时间】:2019-04-08 15:44:36
【问题描述】:

我有一个这样定义的表:

 Schema::create('tableA', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('user_id')->unsigned();
            $table->integer('label_id')->unsigned();
            $table->date('date');
            $table->integer('value');
            $table->unique(['user_id','label_id','date']);
            $table->timestamps();
        });

该表使用 user_id、label_id 和 date 的复合键。

我想使用 Model::updateOrCreate 方法更新表格:

 Model::updateOrCreate(
                [
                    'user_id' => $user_id,
                    'label_id' => $label_id,
                    'date' => $date,
                    'value' => $value,
                ]);

但是,如果我在具有复合键的行已经存在时运行该方法,则会出现错误,因为 Laravel 似乎不适用于复合键。

例如行

[
user_id:2,
label_id:3,
date:'2019-04-04',
value: 44
]

无法使用更新

Model::updateOrCreate([
    user_id:2,
    label_id:3,
    date:'2019-04-04',
    value: 100
]);

这是否意味着无法使用 updateOrCreate 并且我需要在尝试添加之前检查每一行是否存在?

【问题讨论】:

  • 你使用的是什么版本的 Laravel?
  • 我使用的是 Laravel 5.6.34
  • 我认为这里更大的问题是您试图将枢轴用作普通模型。
  • @apokryfos .. 您将他的“更新”示例称为“枢轴”的依据是什么? OP 没有处理“中间表”(因为 Laravel 描述了一个数据透视表)——他只是试图更新恰好具有复合键的行。我们中的许多人已经设计了 20 多年的数据会使用复合键,因为它们比一些随机无意义的“id”字段更有意义、更清晰。那么,为什么您将其描述为“枢轴”?我认为接受的答案很好地解决了 OP 的问题。
  • @McAuley 我将其描述为枢轴,因为复合键似乎由外键组成。我可能错了,因为它没有明确指定,但命名约定似乎暗示了这一点。如果是这种情况,那么该表在描述关系的上下文之外将没有任何意义,这就是我说它是数据透视表时的意思。我只提到这一点是因为 Laravel 有工具可以通过参与关系的实体来处理数据透视表,并且这些实体更喜欢直接操作数据透视表。

标签: laravel eloquent


【解决方案1】:

如果您想根据user_id 更新一行,updateOrCreate 的第一个参数是您要匹配的字段数组,第二个参数包含应该更新的字段。所以从你所说的我相信你应该使用这个:

Model::updateOrCreate([
    user_id => 2,
    label_id => 3,
    date => new Carbon('2019-04-04')
],
[
    value => 100
]);

【讨论】:

  • 不,我想更新复合键的所有 3 个部分所针对的特定行 - user_id、label_id 和 date。
猜你喜欢
  • 1970-01-01
  • 2021-07-03
  • 2017-07-30
  • 2020-10-14
  • 2019-02-13
  • 1970-01-01
  • 2021-09-24
  • 2018-11-19
  • 1970-01-01
相关资源
最近更新 更多