我通过播种机创造了很多问题。我正在做的格式是这个
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);
有什么方法可以让上面的正则表达式工作吗?需要注意的一点是,如果重要的话,只有少数问题有这个正则表达式吗?
由于
答案 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