Laravel 5.4 将 NULL 保存到数据库不起作用
Laravel 5.4 save NULL to database not working
以下代码在数据库中产生一个空值,当我从数据库中取出它时,它是一个空字符串。
$customer->update(['company' => NULL]);
你应该考虑三件事:
1) 确保 table 中 nullable
中的 company
列。如果不是,则无法将 null
放在那里。
2) 确保 $fillable
属性 of Customer
模型列 company
3) 验证您的 Customer
模型中没有任何突变器 - 因此验证您没有 setCompanyAttribute
方法,如果它被设置为 null,该方法可能会自动将值更改为空字符串
解决方案
如果您希望数据库中的某个字段为空并且不使用修改器,一切都很好。
您使用的是增变器吗,在我的例子中是以下代码段。
public function setCompanyAttribute($value)
{
$this->attributes['company'] = ucfirst($value);
}
然后你需要检查$value是否为null,然后手动将其设置为null,否则它将是一个空字符串。
要在每个模型上自动执行此操作,您可以在 EventServiceProvider 中将空字符串设置回 null。
Event::listen('eloquent.saving: *', function ($eventName, array $data) {
$attributes = [];
foreach ($data as $model) {
foreach( $model->getAttributes() as $key => $value ) {
$attributes[$key] = (is_string($value) && $value === '') ? null : $value;
}
$model->setRawAttributes($attributes);
}
return true;
});
重要的是首先检查模型中的所有属性并将其设置为临时数组。现在在模型实例的 setAttribute() 方法中,检查是否存在修改器。但这正是您不想要的,因为它会将所有具有定义的增变器的字段设置为空字符串。而是使用 setRawAttribute 以便用临时数组中的属性覆盖旧属性。
这样做是安全的,因为如果选中的值不是空字符串,则会为该字段采用已经存在的值。否则,如果它是空字符串,则设置为 null。
希望对您有所帮助!
以下代码在数据库中产生一个空值,当我从数据库中取出它时,它是一个空字符串。
$customer->update(['company' => NULL]);
你应该考虑三件事:
1) 确保 table 中 nullable
中的 company
列。如果不是,则无法将 null
放在那里。
2) 确保 $fillable
属性 of Customer
模型列 company
3) 验证您的 Customer
模型中没有任何突变器 - 因此验证您没有 setCompanyAttribute
方法,如果它被设置为 null,该方法可能会自动将值更改为空字符串
解决方案
如果您希望数据库中的某个字段为空并且不使用修改器,一切都很好。
您使用的是增变器吗,在我的例子中是以下代码段。
public function setCompanyAttribute($value)
{
$this->attributes['company'] = ucfirst($value);
}
然后你需要检查$value是否为null,然后手动将其设置为null,否则它将是一个空字符串。
要在每个模型上自动执行此操作,您可以在 EventServiceProvider 中将空字符串设置回 null。
Event::listen('eloquent.saving: *', function ($eventName, array $data) {
$attributes = [];
foreach ($data as $model) {
foreach( $model->getAttributes() as $key => $value ) {
$attributes[$key] = (is_string($value) && $value === '') ? null : $value;
}
$model->setRawAttributes($attributes);
}
return true;
});
重要的是首先检查模型中的所有属性并将其设置为临时数组。现在在模型实例的 setAttribute() 方法中,检查是否存在修改器。但这正是您不想要的,因为它会将所有具有定义的增变器的字段设置为空字符串。而是使用 setRawAttribute 以便用临时数组中的属性覆盖旧属性。
这样做是安全的,因为如果选中的值不是空字符串,则会为该字段采用已经存在的值。否则,如果它是空字符串,则设置为 null。
希望对您有所帮助!