2017-12-27 12 views
6

내 Eloquent 모델은 30 개의 필드로 구성됩니다.여러 필드 중 하나를 필수 필드로 만들려면 어떻게해야합니까?

검증 규칙 :

  1. 첫 번째 필드는, 적어도 하나 개의 필드는 을 필요로하는 다른 29 개 필드의 아웃 필요한
  2. 입니다.

Laravel 5.5의 문서를 확인하면 required_without_all 유효성 검사 규칙이 상당히 유용하다는 것을 알았습니다. 위의 유효성 검사 규칙을 작성하는 한 가지 방법은 required_without_all:field1,.....,field28 (즉 첫 번째 필드와 주어진 필드를 제외한 다른 필드)를 지정하는 것입니다.

그러나이 경우 유효성 검사 규칙에 28 개의 필드 이름을 써야합니다. 모든 필드는 첫 번째 필드를 제외합니다. 더 단순하고 중복되지 않는 방법이 있습니까?

답변

3

당신은 당신이 관련 Request 수업 시간에 이런 일을 할 수있는, 여전히 required_without_all을 사용할 수 있지만 유지 보수를 유지하기 :

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

t 위의 코드는 효과가 있었지만 다른 29 개 필드에 대해 몇 가지 규칙이 있으므로 약간 변경했습니다. 이 줄을'$ rules [$ field]. = '| required_without_all :'으로 변경했습니다. implode (',', $ fields-> whereNotIn (null, [$ field]) -> toArray());'변경 후에는 더 이상 작동하지 않습니다. 이 필드들에 대한 나의 규칙은''때때로 | date_format : Y-m-d'''''무언가''규칙과 관련이 있습니까? – Benedict

+0

@Benedict는 $ rules [$ field] = $ rules [$ field]를 시도합니다. '| required_without_all :'.... ' –

3

사용 additionalRule에서 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()) { 
    // 
} 

() 당신이 할 수있는 방법 다음과 같이 입력하십시오 :

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