Trying to validate the username already exists going wrong Laravel 8

I am trying to validate that a user already exists but I’m having trouble with it.

This is the function to create a user

protected function storeCliente(Request $request)
    {

        $request->validate([
            'name' => 'required|max:40|',
            'surname' => 'required|max:40|',
            'cedula' => 'required|digits:10|numeric',
            'email' => 'required|unique:users',
            'telefono' => 'required|between:9,15',
            'direccion' => 'required',
            'ciudadResi' => 'required',
            'fechaNacimiento' => 'required',
            'genero' => 'required',
        ],
        [
            'name.max' =>"El nombre de la especialidad no puede ser mayor a 40 caracteres",
            'surname.max' =>"El apellido de la especialidad no puede ser mayor a 40 caracteres",
            'cedula.digits' =>"La cédula tiene que tener 10 caracteres",
            'cedula.numeric' =>"La cédula tiene que ser numérica",
            'telefono.between' =>"El número de teléfono tiene que tener entre 9 y 15 caracteres",
            'email.unique' =>"Ya existe un usuario con ese correo electrónico"
        ]);
        
        $a= 'C'.$request['cedula'];
        if(User::where('name',$a)){
            return redirect()->back()->withErrors(['Un usuario con ese nombre ya existe, revise la cédula y el rol']);
        }

        $cliente= Persona::create([
            'nombre' => $request['name'],
            'apellido' => $request['surname'],
            'cedula' => $request['cedula'],
            'email' => $request['email'],
            'telefono' =>$request['telefono'],
            'direccion' =>$request['direccion'],
            'ciudadResi' =>$request['ciudadResi'],
            'fechaNacimiento' =>$request['fechaNacimiento'],
            'genero' =>$request['genero'],
            'estado'=> '1',
            'idTipoPersona'=>'2'
        ]);
        $usuario= User::create([
            'name' => 'C'.$request['cedula'],
            'email' => $request['email'],
            'password' => Hash::make('C'.$request['cedula']),
            'role' => 'cliente',
            'idPersona'=> $cliente->id,
            'estado' => 2
        ]);
        $mensaje = 'Se creó el cliente '.$cliente->nombre.' '.$cliente->apellido.' con usuario '. $usuario->name;
        return redirect()->route('home',['mensaje'=>$mensaje]);
    }

As you can see I create a persona and the user is created based on the field cedula that comes from a form input following this logic. 'C'.$request['cedula']

I’m trying to check if the username already exists and if it already does redirect to the form and report the error with the code below.

$a= 'C'.$request['cedula'];
            if(User::where('name',$a)){
                return redirect()->back()->withErrors(['Un usuario con ese nombre ya existe, revise la cédula y el rol']);
            }

But with that code even when the field name would be unique it doesn’t allow me to register it.

Gonna show the structure of each table.

Users table

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `role` varchar(20) DEFAULT NULL,
  `name` varchar(100) DEFAULT NULL,
  `email` varchar(100) DEFAULT NULL,
  `password` varchar(250) DEFAULT NULL,
  `created_at` datetime DEFAULT NULL,
  `updated_at` datetime DEFAULT NULL,
  `remember_token` varchar(255) DEFAULT NULL,
  `idPersona` int(11) DEFAULT NULL,
  `estado` tinyint(1) NOT NULL DEFAULT 31,
  `prueba` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `users_FK` (`idPersona`),
  CONSTRAINT `users_FK` FOREIGN KEY (`idPersona`) REFERENCES `personas` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=48 DEFAULT CHARSET=utf8mb4

Personas table
CREATE TABLE `personas` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nombre` varchar(50) NOT NULL,
  `apellido` varchar(50) NOT NULL,
  `cedula` varchar(10) NOT NULL,
  `email` varchar(40) DEFAULT NULL,
  `telefono` varchar(13) DEFAULT NULL,
  `direccion` varchar(100) NOT NULL,
  `ciudadResi` varchar(50) NOT NULL,
  `fechaNacimiento` date NOT NULL,
  `genero` varchar(100) NOT NULL,
  `estado` binary(1) NOT NULL,
  `idTipoPersona` int(11) NOT NULL,
  `idPersona` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `personas_FK` (`idTipoPersona`),
  KEY `personas_FK_1` (`idPersona`),
  CONSTRAINT `personas_FK` FOREIGN KEY (`idTipoPersona`) REFERENCES `tipo_personas` (`id`),
  CONSTRAINT `personas_FK_1` FOREIGN KEY (`idPersona`) REFERENCES `personas` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=70 DEFAULT CHARSET=utf8mb4

If I’m not making myself clear I can edit the question to try to explain myself better.
In summary what I’m trying to do is that before adding to the database the persona and the user it checks if the username that would be made of 'C'.$request['cedula'] already exists, and if it does redirect back to the form showing the error.

Edit This is how I have my function after Robert suggestion with the error Class "AppHttpControllersRule" not found

protected function storeCliente(Request $request)
    {

        $request->validate([
            'name' => 'required|max:40|',
            'surname' => 'required|max:40|',
            'cedula' => [
                'required',
                'digits:10',
                'numeric',
                Rule::unique('users', 'name')
                    ->where('name', 'C' . $request['cedula'])
            ],
            'email' => 'required|unique:users',
            'telefono' => 'required|between:9,15',
            'direccion' => 'required',
            'ciudadResi' => 'required',
            'fechaNacimiento' => 'required',
            'genero' => 'required',
        ],
        [
            'name.max' =>"El nombre de la especialidad no puede ser mayor a 40 caracteres",
            'surname.max' =>"El apellido de la especialidad no puede ser mayor a 40 caracteres",
            'cedula.digits' =>"La cédula tiene que tener 10 caracteres",
            'cedula.numeric' =>"La cédula tiene que ser numérica",
            'cedula.unique' => "Un usuario con ese nombre ya existe, revise la cédula y el rol",
            'telefono.between' =>"El número de teléfono tiene que tener entre 9 y 15 caracteres",
            'email.unique' =>"Ya existe un usuario con ese correo electrónico"
        ]);
        
        
        $cliente= Persona::create([
            'nombre' => $request['name'],
            'apellido' => $request['surname'],
            'cedula' => $request['cedula'],
            'email' => $request['email'],
            'telefono' =>$request['telefono'],
            'direccion' =>$request['direccion'],
            'ciudadResi' =>$request['ciudadResi'],
            'fechaNacimiento' =>$request['fechaNacimiento'],
            'genero' =>$request['genero'],
            'estado'=> '1',
            'idTipoPersona'=>'2'
        ]);
        $usuario= User::create([
            'name' => 'C'.$request['cedula'],
            'email' => $request['email'],
            'password' => Hash::make('C'.$request['cedula']),
            'role' => 'cliente',
            'idPersona'=> $cliente->id,
            'estado' => 2
        ]);
        $mensaje = 'Se creó el cliente '.$cliente->nombre.' '.$cliente->apellido.' con usuario '. $usuario->name;
        return redirect()->route('home',['mensaje'=>$mensaje]);
    }

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

You should fetch the user correctly in your if conditional.

Instead of this

if(User::where('name',$a)){
    ....
}

Try this
if(User::where('name',$a)->first()){
   ....
}

Method 2

protected function storeCliente(Request $request)
    {

        $request->validate([
            'name' => 'required|max:40|unique:users',
            'surname' => 'required|max:40|',
            'cedula' => 'required|digits:10|numeric',
            'email' => 'required|unique:users',
            'telefono' => 'required|between:9,15',
            'direccion' => 'required',
            'ciudadResi' => 'required',
            'fechaNacimiento' => 'required',
            'genero' => 'required',
        ],
        [
            'name.max' =>"El nombre de la especialidad no puede ser mayor a 40 caracteres",
            'surname.max' =>"El apellido de la especialidad no puede ser mayor a 40 caracteres",
            'cedula.digits' =>"La cédula tiene que tener 10 caracteres",
            'cedula.numeric' =>"La cédula tiene que ser numérica",
            'telefono.between' =>"El número de teléfono tiene que tener entre 9 y 15 caracteres",
            'email.unique' =>"Ya existe un usuario con ese correo electrónico"
        ]);
        
        $a= 'C'.$request['cedula'];
        if(User::where('name',$a)){
            return redirect()->back()->withErrors(['Un usuario con ese nombre ya existe, revise la cédula y el rol']);
        }

        $cliente= Persona::create([
            'nombre' => $request['name'],
            'apellido' => $request['surname'],
            'cedula' => $request['cedula'],
            'email' => $request['email'],
            'telefono' =>$request['telefono'],
            'direccion' =>$request['direccion'],
            'ciudadResi' =>$request['ciudadResi'],
            'fechaNacimiento' =>$request['fechaNacimiento'],
            'genero' =>$request['genero'],
            'estado'=> '1',
            'idTipoPersona'=>'2'
        ]);
        $usuario= User::create([
            'name' => 'C'.$request['cedula'],
            'email' => $request['email'],
            'password' => Hash::make('C'.$request['cedula']),
            'role' => 'cliente',
            'idPersona'=> $cliente->id,
            'estado' => 2
        ]);
        $mensaje = 'Se creó el cliente '.$cliente->nombre.' '.$cliente->apellido.' con usuario '. $usuario->name;
        return redirect()->route('home',['mensaje'=>$mensaje]);
    }

Method 3

Is there a reason that you’re trying to validate the user that way? You should be able to just add it as another validation rule. Try something like this (I just copied your error message where you’re checking for users with that name and added that return error message as the “cedula.unique” validation error message). The idea would be something like this:

$request->validate([
    // ...
    'cedula' => [
        'required',
        'digits:10',
        'numeric',
        Rule::unique('users', 'name')
            ->where('name', 'C' . $request['cedula'])
    ],
],
[
    // ...
    'cedula.unique' =>"'Un usuario con ese nombre ya existe, revise la cédula y el rol'",
]);


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x