以下代码导致数据库中出现空值,并且当我从数据库中获取空值时,它将返回一个空字符串。Laravel 5.4将NULL保存到数据库不起作用
$customer->update(['company' => NULL]);
以下代码导致数据库中出现空值,并且当我从数据库中获取空值时,它将返回一个空字符串。Laravel 5.4将NULL保存到数据库不起作用
$customer->update(['company' => NULL]);
你应该考虑三两件事:
1)确保在nullable
company
列在表格中。如果不是这样,就不可能把null
放在那里。
2)请确保您有在Customer
模型列的$fillable
财产company
3)确认你没有任何突变在Customer
模型 - 所以确认你没有setCompanyAttribute
方法可能会更改值自动空字符串,如果它设置为null
感谢您的答案,我发现错误一个公司的变种人:// –
SOLUTION
如果你想在数据库中的字段为空,你不要每次使用赋值函数事情很好。
您是否在使用mutator,在我的情况下是以下代码片段。
public function setCompanyAttribute($value)
{
$this->attributes['company'] = ucfirst($value);
}
然后,你需要检查,如果$值为空,然后手动将其设置为空,否则这将是一个空字符串。
要在每个模型上自动执行该操作,可以在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,以便旧属性被临时数组中的属性覆盖。
这样做很安全,因为如果选中的值不是空字符串,则已为该字段取现有的值。否则,如果它是一个空字符串,则设置为空。
希望它有帮助!
这是很奇怪的改变接受你的和现在的代码没有在原始问题 –
@MarcinNabiałeksry我改变了它。认为下一位读者看看我如何解决它会有所帮助。您的答案列出了一些必须审查的部分,但是我提供了一个可能的解决方案。 –
并且当你从db中取出时你想要NULL吗? – dparoli
@dparoli是的,该字段是可选的,它可以为空,所以如果它为空,我希望得到空,而不是一个空字符串,并在数据库中的空字段 –