2017-12-27 212 views
6

Eloquent modelim 30 alandan oluşur.Gerekli birkaç alandan birini nasıl yapabilirim?

Doğrulama Kural:

  1. ilk alan, en az bir alan gerekli olan diğer 29 alanların dışında gerekli
  2. mesafesindedir.

Laravel 5.5 belgelerini kontrol ederek, required_without_all doğrulama kuralını oldukça uyumlu buldum. Yukarıdaki doğrulama kuralını yazmanın bir yolu, required_without_all:field1,.....,field28 numaralı 29 alanın her birinde (yani, birinci ve belirtilen alan hariç diğer alanların) belirtilmesidir. Ancak, bu, 28 alan adının doğrulama kuralının yazılmasını gerektirir. ilki hariç tüm alanlar. Daha basit, gereksiz bir yaklaşım var mı?

cevap

3

Sen ilişkili Request sınıfında böyle bir şey yapabileceğini, hala required_without_all kullanabilirsiniz ancak sürdürülebilir tutmak için:

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

O kod üzerinde çalıştı, diğer 29 alanlar için bazı kurallar var gibi ben de biraz değişiklik yaptım. Bu satırı "$ rules [$ field]. =" | Required_without_all: 'olarak değiştirdim. (',', $ alanlar-> buradaNotIn (null, [$ alan]) -> toArray()); 'değiştirdikten sonra, artık çalışmaz. Bu alanlar için benim kurallarim '' bazen | date_format: Y-m-d''' Bir şey 'kuralıyla ilişkili mi? – Benedict

+0

@Benedict = $ kuralları [$ alan] = $ kuralları [$ alan] deneyin. '| required_without_all:' .... ' –

3

Kullanımı additionalRule yılında 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()) { 
    // 
} 

() yapabilirsiniz yönteme gibi bir şey koyun:

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

return false; 
+0

EkRule() yöntemi nerede tanımlanmalıdır? – Benedict

+0

Özel istek sınıfı kullanmıyorsanız, denetleyicide. Bunu korumalı veya özel yapabilirsin. – Tpojka

+0

Denetleyicinin kendisinde yöntemi tanımladım. Peki, doğrudan $ field1, $ alan2'yi nasıl kullanabiliyorsunuz, $ field1 ..... undefined olduğu bir hatayı atıyor? – Benedict