Laravel 5.6对空字段的验证

时间:2018-07-31 10:17:30

标签: laravel forms validation default-value

以某种方式,我觉得这应该是一个常见的问题,但是我似乎找不到一个明确的答案。

问题很简单: 在验证表单时,我想从结果数组中排除空的非必填字段-以便使用在数据库级别设置的默认值。

由于Laravel默认情况下使用的是ConvertEmptyStringsToNull中间件(并且我不太愿意更改它),因此这意味着我的空字段将被转换为'null'并发送到我的数据库(因此无法获取其默认值,并实际上中断了查询,因为这些字段在数据库级别不可为空。

$userData = $request->validate([
            'email' => 'required|string|email|max:255|unique:users',
            'number_of_whatever'  => //if this field is empty, I want it stripped out the $userData array - or automatically default to the database default
        ]);

任何有关如何以最简洁的方式解决此问题的帮助将不胜感激!我正在考虑制定一个自定义规则,该规则将排除字段本身(这样我就可以在整个项目中重用此验证规则,而不必每次遇到这种情况时都必须手动执行)。 另一种选择是将其设置为“模型”级别-但并不热衷于此,当它已经在数据库级别完成时,似乎不得不在那儿这样做很奇怪。

谢谢!

3 个答案:

答案 0 :(得分:0)

我认为您可以使用可为空的规则

split(col, '[-/& ]')

答案 1 :(得分:0)

嘿,我已经找到您的问题了,并且为此也做了一些工作。根据以下示例,我已经复制并且现在可以正确理解您的问题,即使验证器允许使用null值,create方法也会引发错误并且不设置默认值。

控制器

$validator = Validator::make($data, [
    'name' => 'max:255',
    'email' => 'max:255',
    'password' => 'max:255',
]);

if ($validator->fails()) {
    dd('Validator has failed');
}

// This throws an error saying that the fields cannot be null!
User::create($data);

用户表

 Schema::create('users', function (Blueprint $table) {
     $table->increments('id');
     $table->string('name')->default('Ken');
     $table->string('email')->default('ken@stackoverflow.com');
     $table->string('password')->default(bcrypt('password'));
     $table->rememberToken();
     $table->timestamps();
 });

我所设计的解决方法是,像这样,在发布请求到达验证程序之前,将所有空值删除。

示例

$data = ['name' => null, 'email' => null, 'password' => null];

foreach($data as $key => $value)
{
    if($value == null)
    {
       unset($data[$key]);
    }
}

这里的逻辑是通过从发布请求中删除为null的字段,USER对象看不到它们具有值,因此允许将表的默认值放到表中,但是如果该值为null则仍然视为一个值,因此默认值将被忽略。

我希望这是有道理的。

我完整代码的结果 Result

答案 2 :(得分:0)

创建一个FormRequest并使用prepareForValidation方法过滤出空值:

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class TestRequest extends FormRequest
{
    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        return
            [
                'username' => 'required|string|email|max:255|unique:users',
                'number_of_whatever' => 'sometimes|integer',
            ];
    }

    protected function prepareForValidation()
    {
        if($this->number_of_whatever == null) {
            $this->request->remove('number_of_whatever');
        }
    }
}

您可以在“有时”规则之后应用除“必需”以外的任何验证,并且仅在值不为null时应用。