以下代码在数据库中产生一个空值,当我从数据库中得到一个空字符串时。
$customer->update(['company' => NULL]);
答案 0 :(得分:6)
你应该考虑三件事:
1)确保表格中company
的{{1}}列。如果不是,就不可能将nullable
放在那里。
2)确保您拥有null
模型列$fillable
的{{1}}属性
3)确认您的Customer
模型中没有任何mutator - 因此请验证您没有company
方法,如果将其设置为null,则可能会自动将值更改为空字符串
答案 1 :(得分:1)
<强>解强>
如果你想让数据库中的一个字段为null而你不使用mutator,一切都很好。
您使用的是mutator,在我的例子中是以下代码段。
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()方法内,如果存在mutator,则完成检查。但这正是你不想要的,因为它会将一个定义的mutator设置为空的刺。而是使用setRawAttribute,以便使用临时数组中的旧属性覆盖旧属性。
这样做是安全的,因为如果选中的值不是空字符串,则对该字段采用已存在的值。否则,如果它是一个空字符串,则设置为null。
希望它有所帮助!