【问题标题】:Mass Assignment issue with `updateOrCreate` in Laravel, why?Laravel 中“updateOrCreate”的批量分配问题,为什么?
【发布时间】:2018-12-01 14:18:25
【问题描述】:

我有一个非常简单的模型:

class Employee extends \Eloquent
{
}

我想做的是将本地数据与存储在远程服务器中的数据同步。在我的 MySQL 中,我有

PRIMARY KEY (`id`),
UNIQUE KEY `id_UNIQUE` (`id`)

所以我敢肯定,如果我在id 上匹配,我将永远不会进行批量分配。

所以当我这样做时:

foreach((new RemoteEmployee())->all() as $emp) {
    Employee::updateOrCreate(['id' => $emp['id']], [
        'firstname' => $emp['id'], 
        'lastname' => $emp['lastname'], 
        'phone' => $emp['phone']
    ]);
}

我不应该得到这个错误:

Add [id] to fillable property to allow mass assignment on [App\Models\Employee].

无论如何,如果我修改我的模型如下:

class Employee extends \Eloquent
{
    protected $fillable = ['*'];
}

我没有收到任何错误,但我的条目为空。

为什么?

【问题讨论】:

  • 可填充属性是否接受通配符?
  • 好问题,我也试过['id']。如果我必须提及模型中的每一列,我也一样。
  • 但您还要填写名字、姓氏和电话号码。
  • 但是我没有做批量作业:(
  • 我认为您不应该在该查询中使用 id 。因为第一个数组使 updateOrCreate 设置了具有自动增量属性的 id 列(我猜)。您应该搜索名字和姓氏,或者单独查询数据库。

标签: php laravel laravel-5 eloquent mass-assignment


【解决方案1】:

首先从字段中排除 id

其次,如果您想允许所有字段使用protected $guarded = [];。

【讨论】:

    【解决方案2】:

    一旦您在$fillable 中设置了至少一项,Eloquent 将停止抛出批量分配异常。但是,它将忽略为批量分配提供的任何未包含在$fillable 中的字段。因此它实际上忽略了所有内容,因为 $fillable 中的 Eloquent 不支持 '*'。

    【讨论】:

      猜你喜欢
      • 2016-01-09
      • 2013-07-26
      • 2021-04-11
      • 2017-11-08
      • 2013-07-31
      • 1970-01-01
      • 2011-11-20
      • 1970-01-01
      • 2020-10-16
      相关资源
      最近更新 更多