2017-12-27 953 views
6

我的雄辯模型由30個字段組成。如何製作所需的幾個字段之一?

驗證規則:

  1. 的第一個字段需要
  2. 出了其他29個字段,所述至少一個字段是需要

檢查Laravel 5.5的文檔,我發現required_without_all驗證規則相當可信。編寫上述驗證規則的一種方法是在29個字段中的每一箇中指定required_without_all:field1,.....,field28(即除第一個和給定字段之外的其他字段)

但是,這要求在驗證規則中寫入28個字段名稱除第一個之外的所有領域。有沒有更簡單的,非冗餘的方法?

回答

3

您仍然可以使用required_without_all,但要保持它的可維護性,你可以做這樣的事情在相關Request類:

public function rules() 
{ 
    $rules = [ 
     'name' => 'required', 
     'email' => 'required|email' 
    ]; 

    $fields = collect(['field1', 'field2', ...., 'field29']); 

    foreach ($fields as $field) { 
     $rules[$field] = 'required_without_all:' . implode(',', $fields->whereNotIn(null, [$field])->toArray()); 
    } 

    return $rules; 
} 
+0

雖然噸他上面的代碼工作,我做了一個小的改變,因爲我對其他29個領域有更多的規則。我將此行更改爲'$ rules [$ field]。='| required_without_all:'。 implode(',',$ fields-> whereNotIn(null,[$ field]) - > toArray());'更改後,它不再工作。我對這些領域的規則是''有時候| date_format:Y-m-d''與'something'規則有關嗎? – Benedict

+0

@Benedict嘗試'$ rules [$ field] = $ rules [$ field]。 '| required_without_all:'....' –

3

使用after validation hook

$validator = Validator::make($request->all(), [ 
    'field1' => 'required', 
]); 

$validator->after(function ($validator) { 
    if (!$this->additionalRule()) { 
     $validator->errors()->add('field2', 'At least one additional field has to be set!'); 
    } 
}); 

if ($validator->fails()) { 
    // 
} 

在additionalRule()方法,你可以把這樣的東西:

if (isset($field2, field3,...field29)) {// at least one field is set 
    return !empty($field2 || field3 || ... || field29); 
} 

return false; 
+0

additionalRule()方法應該在哪裏定義? – Benedict

+0

如果您不使用自定義請求類,那麼在控制器中。您可以將其設爲受保護或私密。 – Tpojka

+0

我已經在控制器本身中定義了該方法。那麼,如何直接使用$ field1,$ field2,它會拋出一個錯誤,即$ field1 .....是未定義的? – Benedict

相關問題