验证:如何设置不需要的字段“null”'当输入为空时

时间:2014-07-22 08:46:35

标签: laravel laravel-4

我有一个如下所示的验证规则:

$rules = ['target' => 'numeric'];

这不是必填字段。如果未在输入中指定值(即Input :: get('target')==''),我希望在数据库中将该字段设置为NULL。

目前上述规则已通过,并且在没有数字输入的情况下,它在数据库中设置为0.

什么是最好的解决方案?

4 个答案:

答案 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,您无需在保存之前进行检查。

Reference

答案 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会发生。