Eloquent updateOrCreate 不更新

j. *_*arc 8 php slim laravel eloquent

我在使用 updateOrCreate 时遇到问题。

下面的代码成功地创建了一个新行;但是,在更新现有行时,它根本不起作用!

comm_helpful::updateOrCreate(
           ['ID' => 1],
           ['time' => 3000]
        );
Run Code Online (Sandbox Code Playgroud)

这完全按预期工作:

comm_helpful::where('ID', 1)->update(['time' => 3000]);
Run Code Online (Sandbox Code Playgroud)

我已经将上面的示例剥离到最低限度(我在调试过程中这样做了),但它仍然无法正常工作!!

小智 8

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

protected $fillable = ['user_x_cliente_id','internet_cliente_id'];
Run Code Online (Sandbox Code Playgroud)

状态为 0。

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

               dd($habilita);
Run Code Online (Sandbox Code Playgroud)

执行 updateOrCreate 后,状态仍为 0 且 No get MassAssignmentException 错误。

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

protected $fillable = ['user_x_cliente_id','internet_cliente_id','status'];
Run Code Online (Sandbox Code Playgroud)

现在 updateOrCreate 可以改变状态。


j. *_*arc 6

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

protected $primaryKey = 'id';
Run Code Online (Sandbox Code Playgroud)

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

protected function setKeysForSaveQuery(Builder $query)
{

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

    return $query;
}
Run Code Online (Sandbox Code Playgroud)

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

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

protected $primaryKey = 'ID';
Run Code Online (Sandbox Code Playgroud)