Laravel 8 Validación FormRequest
Usando nombres diferentes de los campos en la base de datos
Cuando en tus formularios usas nombres en los inputs que son diferentes a los de la tabla en la base de datos.
Tabla en Migrations
Aqui declaramos la tabla, especificando que los campos unicos moduloID y descripcion, van relacionados con un nombre de relación “unicoenregistro”
public function up() { Schema::create('sys_estatus', function (Blueprint $table) { $table->id('estatusID'); $table->integer('moduloID'); $table->string('descripcion',40); $table->boolean('borrado')->default(0); $table->timestamps(); $table->unique(['moduloID','descripcion'],'unicoenregistro'); }); }

Formulario
En los formularios html, uso nombres diferentes a la tabla para que del lado del cliente o compilación no puedan intentar inyectar datos si supieran el nombre de los campos en la tabla.
<form class="needs-validation" method="POST" action="{{route('estatus.store')}}"> @csrf <div class="row"> <div class="col-md-4 mb-4"> <label for="firstName">Descripción</label> <input type="text" class="form-control" id="nombre" name="nombre" placeholder="Escribe el nombre del modulo" value="{{old('nombre')}}"> @error('nombre') <div class="alert alert-danger" role="alert"> <small>*{{$message}}</small> </div> @enderror </div> </div> <div class="row"> <div class="col-md-4 mb-4"> <label for="modulo">Módulo</label> <select class="custom-select d-block w-100" id="modulo" name="modulo"> <option value="">Elije...</option> </select> @error('modulo') <div class="alert alert-danger" role="alert"> <small>*{{$message}}</small> </div> @enderror <hr class="mb-12"> </div> </div> <button class="btn btn-primary btn-lg btn-block bg-blue-500 " type="submit">Agregar Estatus</button> </form>
FormRequest
Aqui fue donde buscando por internet, encontré esta forma, para que funcione y no este marcando error hay que agregar esta clase “Illuminate\Validation\Rule;”, entonces en la mayoria de los ejemplos viene solo Rule::unique(‘tabla’)->where(…..), y asi, pero pues curioseando un poco, o de hecho en el editor, fijandose mas, te das cuenta que acepta un segundo parametro y es el nombre del campo, asi es como pudo funcionar, si hay otra manera mas facil. Favor de hacermelo saber, si la encuentro publicare otra entrada.
public function rules() { return [ 'nombre'=> [Rule::unique('sys_estatus','descripcion')->where('moduloID',$this->modulo) ], 'modulo'=> [ 'required', Rule::unique('sys_estatus','moduloID')->where('descripcion',$this->nombre) ], ]; }