Eloquent updateOrCreate无法更新数据

9

我在使用updateOrCreate时遇到了问题。

以下代码可以成功创建新行;但是当要更新现有行时,它完全不起作用!

comm_helpful::updateOrCreate(
           ['ID' => 1],
           ['time' => 3000]
        );

这个功能正如预期的那样运作:

comm_helpful::where('ID', 1)->update(['time' => 3000]);

我已经将上面的示例削减到最小限度(这是我作为调试的一部分所做的),但它仍然无法工作!!

你有收到任何错误吗? - anwerj
你是否遇到了 MassAssignmentException 异常?并且在你的模型中,你是否已经定义了需要进行批量赋值的字段,放在了 protected $fillable 变量中? - Sapnesh Naik
展示你的控制器和更新表单。 - Olasunkanmi
没有错误/异常,并且我已经在模型上设置了$fillable。 - j. marc
那个模型是否有任何监听“updating”事件的东西?“fillable”中是否有任何缺失字段? - lagbox
2个回答

12

我有一个类似的问题。我的模型具有:

protected $fillable = ['user_x_cliente_id','internet_cliente_id'];

状态为0。

              $habilita = leilao_habs::updateOrCreate(
                  [
                    'user_x_cliente_id' => $user_x_cliente->id,
                    'internet_cliente_id' => $int_cli->id
                  ],
                  ['status' => 1]
               );

               dd($habilita);

在执行updateOrCreate之后,状态仍为0且未出现MassAssignmentException错误。

解决方案是将状态添加到protected $fillable中。

protected $fillable = ['user_x_cliente_id','internet_cliente_id','status'];

现在的 updateOrCreate 工作方式已经改变了状态。


虽然通常是这个原因,但OP已经在评论中声明这不是一个批量赋值错误。 - Chuck Le Butt

9

好的,在我快要把头发都拔光的时候,我找到了 Eloquent 设置的问题:

protected $primaryKey = 'id';

这个内容涉及到it技术,它描述了一个在更新方法中使用且由getKeyName()返回的内容。

protected function setKeysForSaveQuery(Builder $query)
{

    $query->where($this->getKeyName(), '=', $this->getKeyForSaveQuery());

    return $query;
}

我意识到故事中的'id'是大写而不是小写!我想这意味着我的答案是需要确保使用小写的' id '作为主键或在模型上进行覆盖。
protected $primaryKey = 'ID';

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接