2017-03-09 48 views
1

我通过播种机创造了很多问题。我正在做的格式是这样的播种验证阵列

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})?$/'] 
]); 

然而,当我尝试上述种子,我得到一个数组到字符串转换错误。我申请验证的方法是像这样

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

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

有什么办法,我可以得到上述正则表达式的工作?有一点要注意的是,只有少数几个问题有这个正则表达式,如果这很重要的话?

由于

回答

1

当使用正则表达式模式,它可能需要在阵列中,而不是使用管的分隔符来指定的规则,特别是当正则表达式包含一个管道字符。

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

以管道分隔符存储字符串格式的规则也会使您很难在从数据库中检索时将它们拆分为数组。我建议将其存储为一个类似的划定结构像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在你的questions表迁移。

为了进一步简化代码,你可以利用Laravel的attribute casting功能号称处理json_encode/json_decode的你:

protected $casts = [ 
    'rule' => 'array', 
];