2017-12-27 138 views
6

Mô hình Eloquent của tôi bao gồm 30 trường.Làm cách nào để tôi thực hiện một trong các trường được yêu cầu?

Validation Rule:

  1. Trường đầu tiên được cần
  2. Trong số 29 lĩnh vực khác, ít nhất một lĩnh vực là cần.

Kiểm tra tài liệu của Laravel 5.5, tôi tìm thấy quy tắc xác thực required_without_all khá liên quan. Một cách để viết quy tắc xác thực ở trên sẽ là chỉ định trong mỗi trường trong số 29 trường required_without_all:field1,.....,field28 (nghĩa là các trường khác không bao gồm trường đầu tiên và trường đã cho)

Nhưng, điều này yêu cầu viết 28 tên trường trong quy tắc xác thực tất cả các trường trừ trường đầu tiên. Có cách tiếp cận đơn giản hơn, không dự phòng nào không?

Trả lời

3

Bạn vẫn có thể sử dụng required_without_all, nhưng để giữ cho nó duy trì, bạn có thể làm một cái gì đó như thế này trong liên quan Request lớp:

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

Trong khi t mã trên làm việc, tôi đã thực hiện một chút thay đổi đối với nó khi tôi có thêm một số quy tắc cho 29 trường khác. Tôi đã thay đổi dòng này thành '$ rules [$ field]. = '| Required_without_all:'. implode (',', $ fields-> whereNotIn (null, [$ field]) -> toArray()); 'Sau khi thay đổi, nó không hoạt động nữa. Các quy tắc của tôi cho các trường này đôi khi là 'date_format: Y-m-d'' Nó có liên quan đến quy tắc' something' không? – Benedict

+0

@Benedict thử '$ quy tắc [$ trường] = $ quy tắc [$ trường]. '| required_without_all:' .... ' –

3

Sử dụng 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()) { 
    // 
} 

Trong additionalRule() phương pháp bạn có thể đặt một cái gì đó như:

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

return false; 
+0

Phương thức additionalRule() nên được định nghĩa ở đâu? – Benedict

+0

Nếu bạn không sử dụng lớp yêu cầu tùy chỉnh, thì trong bộ điều khiển. Bạn có thể biến nó thành bảo vệ hoặc riêng tư. – Tpojka

+0

Tôi đã xác định phương thức trong chính bộ điều khiển. Vì vậy, làm thế nào bạn có thể trực tiếp sử dụng $ field1, $ field2, nó ném một lỗi rằng $ field1 ..... là không xác định? – Benedict

Các vấn đề liên quan