Laravel 中 `updateOrCreate` 的批量分配问题,为什么?
Mass Assignment issue with `updateOrCreate` in Laravel, why?
我有一个非常简单的模型:
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 = ['*'];
}
我没有收到任何错误,但我的条目为空。
为什么?
一旦您在 $fillable
中设置了至少 1 个项目,Eloquent 将停止抛出批量分配异常。但是,它会忽略 $fillable
中未包含的任何为批量分配提供的字段。所以它实际上忽略了一切,因为 '*'
不被 $fillable
中的 Eloquent 支持。
首先从字段中排除id
其次,如果您想允许所有字段,请改用 protected $guarded = [];
。
我有一个非常简单的模型:
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 = ['*'];
}
我没有收到任何错误,但我的条目为空。
为什么?
一旦您在 $fillable
中设置了至少 1 个项目,Eloquent 将停止抛出批量分配异常。但是,它会忽略 $fillable
中未包含的任何为批量分配提供的字段。所以它实际上忽略了一切,因为 '*'
不被 $fillable
中的 Eloquent 支持。
首先从字段中排除id
其次,如果您想允许所有字段,请改用 protected $guarded = [];
。