雄辩更新或创建不更新

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

我在使用 updateOrCreate 时遇到问题。

下面的代码成功创建了一个新行;然而,当涉及到更新现有行时,它根本不起作用!

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

这完全符合预期:

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

我已将上面的示例精简到最低限度(这是我在调试过程中所做的),但它仍然无法正常工作!!

php laravel eloquent slim
3个回答
13
投票

我也有类似的问题。 我的模型有:

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 错误。

解决方案是更改模型,将状态添加到受保护的 $fillable 中:

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

现在 updateOrCreate 可以更改状态。


10
投票

好吧,在几乎完全拔掉我的头发之后;我发现Eloquent设置的问题:

protected $primaryKey = 'id';

用于 update 方法并由 getKeyName() 返回。

protected function setKeysForSaveQuery(Builder $query)
{

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

    return $query;
}

然后我意识到我在故事中的“id”是大写而不是小写!

我想这意味着我的答案是我需要确保我使用小写“id”作为主键或在模型上覆盖它

protected $primaryKey = 'ID';

0
投票

我也遇到了类似的问题,经过很多个小时的拉扯我的头发,我终于找到了罪魁祸首。

结果查询使用了我在模型上设置的全局范围。即使(雄辩的)查询正在更新/创建,它仍然使用您设置的全局范围。

因此,在 updateOrCreate() 方法之前添加 withoutGlobalScope(YourGlobalScope::class) 解决了我的问题。希望这对某人有帮助并节省您几个小时的调试时间!

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