【问题标题】:Trying to validate the username already exists going wrong Laravel 8尝试验证用户名已经存在出错 Laravel 8
【发布时间】:2021-09-20 19:58:58
【问题描述】:

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

这是创建用户的函数

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 是唯一的,它也不允许我注册它。

将显示每个表的结构。

用户表

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

角色表

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'] 组成的用户名是否已经存在,以及它是否重定向回显示错误的表单。

编辑这就是在罗伯特建议错误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]);
    }

【问题讨论】:

    标签: laravel validation registration


    【解决方案1】:

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

    不是这个

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

    试试这个

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

    【讨论】:

      【解决方案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]);
          }
      

      【讨论】:

      • 只需编辑验证即可。
      • 感谢您的帮助,但我不是要验证 $request 的字段,因为 User 中的 name 字段是字符串和 $request 字段的组合。卢西亚诺的回答对我有用。
      【解决方案3】:

      您是否有理由尝试以这种方式验证用户?您应该能够将其添加为另一个验证规则。尝试这样的事情(我刚刚复制了您正在检查具有该名称的用户的错误消息,并将返回错误消息添加为“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'",
      ]);
      

      【讨论】:

      • 所以这也是可能的,我对 Laravel 有点陌生所以不知道这是可能的,我会按照 Robert 的方式尝试。
      • Class "App\Http\Controllers\Rule" not found 即使我尝试使用您的代码,我也会收到该错误。尝试使用使用 App\Http\Controllers\Rule;在开始但它不起作用。
      • 那是因为 Rule 不在 Controllers 命名空间中。将use Illuminate\Validation\Rule; 添加到控制器文件的顶部。
      猜你喜欢
      • 2021-10-29
      • 1970-01-01
      • 2016-01-04
      • 1970-01-01
      • 2014-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多