我有一个如下所示的验证规则:
$rules = ['target' => 'numeric'];
这不是必填字段。如果未在输入中指定值(即Input :: get('target')==''),我希望在数据库中将该字段设置为NULL。
目前上述规则已通过,并且在没有数字输入的情况下,它在数据库中设置为0.
什么是最好的解决方案?
答案 0 :(得分:9)
您只需在调用null
之前将null
值分配给相应的模型属性,就可以在Laravel中将字段设置为save()
。
if(! Input::get('target') ){
$eloquent_model->target = null;
}
$eloquent_model->save();
但是如果要在多个模型中插入空值,可以创建基本模型并由所有其他模型继承它。
class BaseModel extends Eloquent {
public static function boot()
{
parent::boot();
static::creating(function($model) {
static::setNullWhenEmpty($model);
return true;
});
}
private static function setNullWhenEmpty($model)
{
foreach ($model->toArray() as $name => $value) {
if (empty($value)) {
$model->{$name} = null;
}
}
}
}
现在所有空字段都会自动设置为null
,您无需在保存之前进行检查。
答案 1 :(得分:8)
在这种情况下,我喜欢使用mutators:
public function setTargetAttribute($target){
$this->attributes['target'] = $target ?: null;
}
答案 2 :(得分:1)
我认为这不是laravel的问题,你必须添加标签mysql ... 更改表以将Null添加为默认值。当前如果传递空值,它将添加0,因为默认情况下它不是NULL并显示
Warning: #1366 Incorrect integer value: '' for column 'target' at row 1.
这是要改变的查询..
ALTER TABLE `table` CHANGE `target` `target` INT( 11 ) NULL
运行上述查询后,target
将接受NULL值而不是0 !!
答案 3 :(得分:0)
我的解决方案就是这个(Laravel 5.2):
// Model.php
public function nullIfBlank($field) {
return trim($field) !== '' ? $field : null;
}
//扩展Model.php的自定义模型
public function setTargetAttribute($target) {
$this->attributes['target'] = $this->nullIfBlank($target);
}
注意完全如上所述命名你的setter(mutator),lowerCamelCase和magic会发生。