为了账号安全,请及时绑定邮箱和手机立即绑定

如何处理电子邮件错误的重复条目?

如何处理电子邮件错误的重复条目?

PHP
HUX布斯 2021-11-05 13:00:55
我有一个表单,管理员可以在其中添加用户。当我使用数据库中存在的一些电子邮件提交表单时,我收到错误消息SQLSTATE[23000]:违反完整性约束:1062 键“users_email_unique”的重复条目“mail@mail.com”我想避免这个错误,而是得到例如警告“邮件被占用”或类似的东西。任何帮助表示赞赏。这是我的代码。用户控制器.phppublic function store(StoreUserInfo $data){    $data->validated();    $user = User::create([        'first_name' => $data['first_name'],        'last_name' => $data['last_name'],        'email' => $data['email'],        'password' => Hash::make($data['password']),        'city' => $data['city']    ]);     return redirect()        ->route('admin.users')        ->with('message', 'User created successfully');}商店用户信息.phppublic function rules(){    $emailid = (Auth::user()->roles()->first()->name == 'admin')        ? (isset($this->user->id)?$this->user->id:Auth::user()->id) : Auth::user()->id;    return [        'first_name' => ['required', 'string', 'max:255'],        'last_name' => ['required', 'string', 'max:255'],        'email' => ['required', 'string', 'email', 'max:255', 'unique:users,email,' . $emailid],        'city' => ['required', 'exists:cities,city']    ];}
查看完整描述

3 回答

?
弑天下

TA贡献1818条经验 获得超8个赞

你可以这样检查。


public function store(StoreUserInfo $data)

{

    $data->validated();


  $email = User::where('email',$data['email'])->first();

 if($email){

    return redirect()

    ->route('admin.users')

    ->with('message', 'Email is already exists.');

 }


$user = User::create([

    'first_name' => $data['first_name'],

    'last_name' => $data['last_name'],

    'email' => $data['email'],

    'password' => Hash::make($data['password']),

    'city' => $data['city']

]);


 return redirect()

    ->route('admin.users')

    ->with('message', 'User created successfully');

}


查看完整回答
反对 回复 2021-11-05
?
神不在的星期二

TA贡献1963条经验 获得超6个赞

您可以使用规则https://laravel.com/docs/5.8/validation#rule-unique创建验证器


$messages = [

    'email.unique' = 'Email taken',

];


Validator::make($email, [

    'email' => [

        'required',

        Rule::unique('users')->where(function ($query) use($email) {

            return $query->where('email', $email);

        }),

    ],

],

$messages

);

这将帮助您管理所有验证,而不仅仅是一个。如果您添加其他验证,您将向用户返回所有错误,而不仅仅是电子邮件错误。


查看完整回答
反对 回复 2021-11-05
?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

这可以通过几种不同的方式处理,但为了可读性和将查询数量保持在最低限度,我将更create()改为 afirstOrCreate()并使用内置的 laravelwasRecentlyCreated来查看用户是否是新用户。


 $user = User::firstOrCreate([

        'email' => $data['email'],

    ], [

        'password' => Hash::make($data['password']),

        'city' => $data['city']

        'first_name' => $data['first_name'],

        'last_name' => $data['last_name'],

]);

由于您可以将两个数组传递给firstOrCreate,它将返回与电子邮件匹配的第一条记录,或者使用您传递给它的属性创建一个新记录。然后,您可以使用wasRecentlyCreated它来检查它是新记录还是已经存在。


if($user->wasRecentlyCreated){

    return whatever you need if it is a new user 

}

else{

   return user was already in the database

}


查看完整回答
反对 回复 2021-11-05
  • 3 回答
  • 0 关注
  • 206 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信