2017-03-09 60 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', 
];