Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

621
Vistas
Validar un campo solo si otro pasa la validación (en Laravel 8)

Tengo un problema, ¿cómo se agrega/elimina una regla si otra regla pasa/falla?

 public function rules() { $rules = [ 'description' => 'required|unique:orders,description', 'user_id' => 'required|unique:users,id', 'supplier_id' => 'required', 'warehouse_id' => 'required|unique:warehouse,id', 'warehouse_qty' => 'required' ]; return $rules; }

Por ejemplo, si la regla "warehouse_id" falla, no sería necesario evaluar las reglas del campo "warehouse_qty" (ya que la identificación del almacén no se encuentra en la base de datos).

O si la regla del campo "user_id" tiene éxito, se deben activar nuevas reglas, como para los campos "user_name" y "user_phone" .

¡Gracias!

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Para validar un campo solo si otro pasa la validación, existen múltiples soluciones.

Enfoque #2 (recomendado)

Desde Laravel 5.3.23; Simplemente mueva cualquier validación de campo que dependa de las reglas de otro campo, al método withValidator(...) de Controller, como:

 use Illuminate\Support\Facades\Validator; // ... public function withValidator($validator) { $validator->after(function ($validator) { // Skip if any previous field was invalid. if ($validator->failed()) return; // Actual validation (for fields depending on previous). Validator::make($this->input(), [ 'warehouse_qty' => ['required'] ])->validate(); }); }

Esto tiene la ventaja de simplemente usar las reglas existentes, como lo haría normalmente (en lugar de reescribir el código fuente de la regla " required ", como lo hace el enfoque a continuación).

Consulte también la publicación relacionada de Laracast .

Tenga en cuenta que si el método rules() no está definido, withValidator(...) nunca se llama (y llamar a $this->input() puede resultar en un error de función no definida).

Enfoque #1 (Respuesta anterior)

Desde Laravel 5.6 y posteriores podemos hacer lo siguiente:

 use Illuminate\Support\Facades\Validator; // ... public function rules() { $result = [ // ... 'warehouse_id' => 'required|unique:warehouse,id', ]; if (Validator::make($this->input(), $result)->passes()) { $result['warehouse_qty'] = [ function ($attribute, $value, $fail) { if (empty($value)) { $fail('The '.$attribute.' is required.'); } }, ]; } return $result; }

Tenga en cuenta que para que funcione lo anterior, el orden de los campos es importante, y el closure debe agregarse a la matriz justo después de los campos de los que depende.

-------===-------

Si bien los anteriores son enfoques personalizados (para asuntos solicitados), hacer eso para las reglas del mismo campo está integrado en Laravel.

  1. Agregar una regla si se pasa otra regla es fácil:
    • Las reglas se ejecutan de izquierda a derecha.
    • Use tubería (el carácter | ) para separar las reglas.
    • Y, siempre que pasen las reglas de la izquierda, se agregarán y/o ejecutarán las reglas posteriores.
  2. La eliminación de una regla si otra regla falla también se puede lograr mediante canalización.

    Simplemente porque se ignora cualquier regla posterior a la fallida.

  3. Pero lo contrario de las dos declaraciones anteriores no es posible:
    • No podemos agregar y/o ejecutar la siguiente regla si la anterior falla.
    • No podemos eliminar la siguiente regla si se pasó la anterior.
    • Al menos, no sin función personalizada.
over 4 years ago · Santiago Trujillo Denunciar

0

Gracias a todos los que dieron sus soluciones a mi problema, en especial a Top-Master, ya que su explicación me mostró otro punto de vista.

Finalmente pude resolver mi problema, y esta es mi solución. Si alguien puede mejorar el código, bienvenido sea.

 public function rules() { $rules = [ 'description' => 'required|unique:orders,description', 'user_id' => 'required|unique:users,id', 'supplier_id' => 'required' ]; $rules = $this->validateItems($rules); return $rules; } public function validateItems($rules){ $rules["warehouse_id"] = ['required', 'unique:warehouse,id']; //Here I validate if the rules of the "warehouse_id" field fail or not. $validator = Validator::make($this->input('warehouse_id'), [ "id" => ['required', 'unique:warehouse,id'] ]); //If the validation doesn't fail, the "warehouse_qty" field is added to $rule if(!($validator->fails())){ $rules["warehouse_qty"] = ['required']; } } return $rules; }
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda