尝试验证用户名已存在出错 Laravel 8

Trying to validate the username already exists going wrong Laravel 8

我正在尝试验证用户是否已经存在,但我遇到了问题。

这是创建用户的函数

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]);
    }

如您所见,我创建了一个 persona 并且用户是根据来自遵循此逻辑的表单输入的字段 cedula 创建的。 'C'.$request['cedula']

我正在尝试检查用户名是否已经存在,以及它是否已经重定向到表单并使用以下代码报告错误。

$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']);
            }

但是使用该代码,即使字段 name 是唯一的,它也不允许我注册它。

将显示每个 table 的结构。

用户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

角色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

如果我没有说清楚,我可以编辑问题以更好地解释自己。 总而言之,我想做的是,在将角色和用户添加到数据库之前,它会检查由 'C'.$request['cedula'] 组成的用户名是否已经存在,如果它确实重定向回显示错误。

编辑 在 Robert 提出错误 Class "App\Http\Controllers\Rule" 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]);
    }

您应该在 if 条件中正确获取用户。

而不是这个

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

试试这个

if(User::where('name',$a)->first()){
   ....
}
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]);
    }

您尝试以这种方式验证用户是否有原因?您应该能够将其添加为另一个验证规则。尝试这样的事情(我刚刚复制了您的错误消息,您正在检查具有该名称的用户,并将 return 错误消息添加为“cedula.unique”验证错误消息)。这个想法是这样的:

$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'",
]);