播种验证数组

时间:2017-03-09 21:40:15

标签: laravel laravel-5.2 laravel-validation

我通过播种机创造了很多问题。我正在做的格式是这个

DB::table('questions')->insert([
    'name' => 'questionOne',
    'rule' => 'nullable|max:50|regex:/(?=.)^\£?(([1-9][0-9]{0,2}(,[0-9]{3})*)|[0-9]+)?(\.[0-9]{1,2})?$/'
]);

由此我提供了字段名称和验证规则。我注意到在应用上述规则时,验证将失败,说明

  

preg_match():找不到结尾分隔符'/'

我做了一些研究,发现了

  

使用正则表达式模式时,可能需要指定规则   一个数组而不是使用管道分隔符,特别是如果常规   表达式包含管道符。

根据建议,我将播种机改为

DB::table('questions')->insert([
    'name' => 'questionOne',
    'rule' => ['nullable|max:50|regex:/(?=.)^\£?(([1-9][0-9]{0,2}(,[0-9]{3})*)|[0-9]+)?(\.[0-9]{1,2})?$/']
]);

但是,当我尝试使用上面的种子时,我得到一个Array to String转换错误。我应用验证的方式就是这样

$rules = [];
$questions = Question::all();
foreach ($questions as $question) {
    if (!empty($question->rule)) {
        $rules["questions.{$question->id}"] = $question->rule;
    }
}

$this->validate($request, $rules);

有什么方法可以让上面的正则表达式工作吗?需要注意的一点是,如果重要的话,只有少数问题有这个正则表达式吗?

由于

1 个答案:

答案 0 :(得分:1)

  

使用正则表达式模式时,可能需要在数组中指定规则而不是使用管道分隔符,尤其是在正则表达式包含管道符时。

这是指传递给$rules的{​​{1}}变量;你的正则表达式模式包含一个管道符$this->validate,它干扰了Laravel在内部将规则字符串拆分成数组的能力。

使用管道分隔符以字符串格式存储规则也会使您难以在从DB中检索时将它们拆分为数组。我建议将它们存储为类似JSON的描述结构,这将使你的播种机成为:

|

和验证:

DB::table('questions')->insert([
    'name' => 'questionOne',
    'rule' => json_encode([
        'nullable',
        'max:50',
        'regex:/(?=.)^\£?(([1-9][0-9]{0,2}(,[0-9]{3})*)|[0-9]+)?(\.[0-9]{1,2})?$/'
    ])
]);

您还希望在$rules = []; $questions = Question::all(); foreach ($questions as $question) { if (!empty($question->rule)) { $rules["questions.{$question->id}"] = json_decode($question->rule, true); } } $this->validate($request, $rules); 表格迁移中将rule列类型更改为JSON。

为了进一步简化代码,您可以使用Laravel的attribute casting功能声明为您处理json_encode / json_decode:

questions