2017-02-27 14 views
0

に存在する場合時にはフィールドを無視します。私は「時々」機能は、おそらく行くには最高の方法であることが、配列との機能を実装する方法を知っていますか?Laravelの検証配列 - 別のフィールドには、私はLaravelアプリケーションのためのいくつかの検証ルールを書いていると、別のフィールドが存在する場合、私はいくつかのフィールドを無視する必要が配列

最初の試み(Laravelはフィールドが存在する任意の時間を検証しているため、動作しませんでした):

// Device Rules 
$deviceRules = [ 
    'devices' => 'required|array|min:1', 
    'devices.*.id' => 'integer', 
    'devices.*.network' => 'max:255', 

    'devices.*.code' => "required_without:devices.*.id|max:255|unique:devices,code", 
    'devices.*.make_id' => 'required_without:devices.*.id|in:' . Make::getImplodedKeys(), 
    'devices.*.model_id' => 'required_without:devices.*.id|in:' . DeviceModel::getImplodedKeys(), 

    'devices.*.fault_id' => 'required|array|min:1', 
    'devices.*.fault_id.*' => 'in:' . Fault::getImplodedKeys(), 
    'devices.*.warranty' => 'required|boolean' 
] 

使用してだから私の第二の試み「時には()」(しかし、私はしないでください非常にこれを実装する方法を知っている):。

public function rules() 
{ 
    // Device Rules 
    $deviceRules = [ 
     'devices' => 'required|array|min:1', 
     'devices.*.id' => 'integer', 
     'devices.*.network' => 'max:255', 

     'devices.*.fault_id' => 'required|array|min:1', 
     'devices.*.fault_id.*' => 'in:' . Fault::getImplodedKeys(), 
     'devices.*.warranty' => 'required|boolean' 
    ]; 

    return $deviceRules ; 
} 

protected function getValidatorInstance(){ 
    $validator = parent::getValidatorInstance(); 

    $validator->sometimes('devices.*.code', 'required|max:255|unique:devices,code', function($input) 
    { 
     return isset($input->devices.*.id); 
    }); 

    $validator->sometimes('devices.*.make_id', 'required|in:' . Make::getImplodedKeys(), function($input) 
    { 
     return isset($input->devices.*.id); 
    }); 

    $validator->sometimes('devices.*.model_id', 'required|in:' . DeviceModel::getImplodedKeys(), function($input) 
    { 
     return isset($input->devices.*.id); 
    }); 

    return $validator; 
} 

私は明らかにそれが動作しませんので、これは、return isset($input->devices.*.id);は間違いなく、エラーがスローされますテストしていません。これを適切に実装するにはどうすればよいですか?

+0

あなたは時々フィールドが必要なときのためにvaidationロジックを指定してくださいすることができますか? – pseudoanime

+0

@pseudoanimeご意見ありがとうございます。私は今解決策を見つけました。 –

答えて

1

私は

私自身の解決策を見つけ、下記を参照してください:

// Device Rules 
$deviceRules = [ 
    'devices' => 'required|array|min:1', 
    'devices.*.id' => 'integer', 
    'devices.*.network' => 'max:255' 
]; 

foreach($this['devices'] as $index => $device){ 
    if(!isset($device['id'])){ 

     $additionalDeviceRules = [ 
      'devices.' .$index. '.code' => 'required|max:255|unique:devices,code', 
      'devices.' .$index. '.make_id' => 'required|in:' . Make::getImplodedKeys(), 
      'devices.' .$index. '.model_id' => 'required|in:' . DeviceModel::getImplodedKeys(), 

      'devices.' .$index. '.fault_id' => 'required|array|min:1', 
      'devices.' .$index. '.fault_id.*' => 'in:' . Fault::getImplodedKeys(), 
      'devices.' .$index. '.warranty' => 'required|boolean' 
     ]; 

     $deviceRules = array_merge($deviceRules, $additionalDeviceRules); 
    } 
} 

を基本的には、代わりにプレースホルダインデックスあなたはインデックスIDを指定する必要が*を使用します。 LaravelはインデックスIDを解析し、ルールを条件付きで適用することができます。

関連する問題