我是Laravel的新手,这是我在Laravel的第一个项目.像往常一样,我首先要开发一个完整的用户身份验证系统.我可以注册一个用户,可以发送用户验证邮件,点击该链接后我可以激活一个新的用户帐户,可以登录并可以注销.但是,当我尝试注册另一个新用户并点击验证链接后,我面临一个例外,即,
Illuminate \ Database \ QueryException SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '' for key 'users_code_unique' (SQL: update `users` set `code` = , `active` = 1, `updated_at` = 2014-07- 25 04:26:06 where `id` = 41)
现在这是我的route.php,
'home', 'uses' =>'HomeController@index' )); Route::get('/signin',array( 'as' =>'signin', 'uses' =>'AccountController@signinGet' )); Route::get('/signup',array( 'as' => 'signup', 'uses' => 'AccountController@signupGet' )); /* /* /Authenticated Group */ Route::group(array('before' => 'auth'),function(){ /* /Sign Out(GET) */ Route::get('/signout',array ( 'as' => 'signout', 'uses' => 'AccountController@signoutGet' )); }); /* /UnAuthenticated Group */ Route::group(array('before' => 'guest'),function(){ /* CSRF Protect*/ Route::group(array('before' => 'csrf'),function(){ /* / Create Account(POST) */ Route::post('/signup',array( 'as'=> 'signup', 'uses'=>'AccountController@signupPost' )); /* / Sign In(POST) */ Route::post('/signin',array( 'as' => 'signin-post', 'uses' => 'AccountController@signinPost' )); }); /* / Sign In (GET) */ Route::get('/signin',array( 'as' => 'signin', 'uses' => 'AccountController@signinGet' )); /* /Create Account(GET) */ Route::get('/signup',array( 'as' => 'signup', 'uses'=> 'AccountController@signupGet' )); Route::get('signup/account/activate/{code}',array( 'as' =>'activate-account', 'uses' =>'AccountController@activatePost' )); }); ?>
这是我的AccountController
'required|email', 'password' => 'required' )); if($validator->fails()){ //redirect to the signin page return Redirect::route('signin') ->withErrors($validator) ->withInput(); }else{ //Attempt user singin $auth = Auth::attempt(array ( 'email' => Input::get('email'), 'password' => Input::get('password'), 'active' => 1 )); if($auth){ //Redirect To intented URL return Redirect::intended('/'); } else { return Redirect::route('signin') ->with('global','The username or password you provided is wrong or account not activated!'); } } return Redirect::route('signin') ->with('global','There is a problem Signing You in.'); } /** * Show the form for creating a new resource. * * @return Response */ public function signupGet() { return View::make('account.signup'); } public function signupPost() { $validator = Validator::make(Input::all(), array( 'email' => 'required|max:255|email|unique:users', 'username' => 'required|min:3|unique:users', 'password' => 'required|min:6', 'password_again' => 'required|same:password' ) ); if($validator->fails()) { return Redirect::route('signup') ->withErrors($validator) ->withInput(); }else { $email = Input::get('email'); $username = Input::get('username'); $password = Input::get('password'); //Activation Code $code = str_random(60); $user = User::create(array( 'email' => $email, 'username' => $username, 'password' => Hash::make($password), 'code' => $code, 'active' => 0 ) ); if($user){ //User Activation Code Creation Mail::send('emails.auth.activate', array('link' => URL::route('activate-account',$code), 'username' => $username),function($message) use ($user) { $message->to($user->email,$user->username)->subject('Activate Your Account'); }); return Redirect::route('signup') ->with('global','Your Account has been created! We have sent you an email to activate your account.Please Check the both the Inbox and Spam Folder.'); } } //return 'This is a Post Result'; } public function activatePost($code){ $user = User::where('code','=',$code)->where('active','=',0); if($user->count()){ $user = $user->first(); $user->active = 1; $user->code = ''; if($user->save()){ return Redirect::route('home') ->with('global','Activated!.You can sign in now!'); } } else{ return Redirect::route('signup') ->with('global','Sorry!We could not activate your acount,please try again later.'); } } public function signoutGet(){ Auth::logout(); return Redirect::route('home'); } } ?>
这是我的创建用户迁移文件
increments('id'); $table->string('username',255)->unique(); $table->string('email',255)->unique(); $table->string('password',60); $table->string('password_temp',60); $table->string('code',60)->unique(); $table->integer('active'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::drop('users'); } } ?>
这是我的user.php
remember_token; } public function setRememberToken($value) { $this->remember_token = $value; } public function getRememberTokenName() { return 'remember_token'; } protected $fillable = array('email','username','password','password_temp','code','active'); use UserTrait, RemindableTrait; /** * The database table used by the model. * * @var string */ protected $table = 'users'; /** * The attributes excluded from the model's JSON form. * * @var array */ protected $hidden = array('password', 'remember_token'); } ?>
现在问题是什么?
确保你的code
字段是nullable
,然后将其设置为空字符串,而不是将其设为null:
$code = null;
然后,您将能够将其保存为NULL(MySQL),同时它仍然是唯一的.
也改变这个:
$user = User::where('code','=',$code)->where('active','=',0); if($user->count()){ $user = $user->first();
至:
$user = User::where('code','=',$code)->where('active','=',0)->first(); if(count($user)){
您不需要调用db两次,只需检查返回的结果是否为null(count
将执行),这意味着它返回了一个User
对象.