2014-05-10 2 views
1

/logout 경로를 눌러서 로그 아웃하려고 할 때 위의 오류가 발생합니다. 스크린 샷에서 참조하는 테이블은 mdbids입니다. 내 모든 ID (문자열, 길이는 16 자)를 저장합니다.QueryException - 무결성 제약 조건 위반 : 1062 'logout'경로에 도달했을 때 중복 항목

사용자가 자신 MDBID (ID)를 생성

enter image description here

mdbids는 테이블에 저장된다.

routes.php

<?php 

Route::get('login', ['as' => 'login', 'uses' => '[email protected]']); 
Route::get('logout', ['as' => 'logout', 'uses' => '[email protected]']); 

<?php use MDB\Forms\LoginForm; class SessionsController extends \BaseController { protected $loginForm; function __construct(LoginForm $loginForm) { $this->loginForm = $loginForm; } public function create() { if(Auth::check()) return Redirect::to("/users"); return View::make('sessions.create'); } public function store() { $this->loginForm->validate($input = Input::only('email','password')); if (Auth::attempt($input)) { Notification::success('You signed in successfully!'); return Redirect::intended('/'); } Notification::error('The form contains some errors'); return Redirect::to('login')->withInput()->withFlashMessage("The form contains some errors"); } public function destroy() { Auth::logout(); return Redirect::home(); } } 

SessionsController.php

내 User.php (모델) 파일에서 가져옵니다 다음과 같습니다. 꽤 큰 파일이므로 전체 파일이 아니지만 ID가 언급 된 유일한 부분입니다.

User.php (모델)

<?php 

public function save(array $options = array()) 
{ 

    $this->mdbid = $this->mdbid ?: str_random(16); 
    $this->key = $this->key ?: str_random(11); 

    Mdbid::create([ 
     'mdbid'  => $this->mdbid, 
     'table_number' => 7, 
     'table_name' => 'users', 
     'created_at' => Carbon::now(), 
     'updated_at' => Carbon::now() 
    ]); 

    parent::save($options); 
} 

내가보고 어디서부터 시작 모른다. 어떤 도움이라도 대단히 감사합니다.

답변

0

로그 아웃으로 인해 save()가 실제로 실행 중이므로 Mdbid::create에 이미 추가 된 키 (로그인 한 경우 또는 사용자 모델의 다른 위치)가 실행 중입니다.

솔루션 # 1 :

당신은 당신이 가지고있는 User 모델에 logout() 기능을 추가 할 수 있습니다.

이렇게하면 두 개의 동일한 키가 로그 아웃 기능에 추가됩니다. 당신은 당신이 User::save() 기능을 사용하지 않아야 성공적인 로그인시 행을 추가 달성하기 위해 무엇을하려고하는


솔루션 # 2

, 오히려, 당신은 인증을 수신해야합니다. 로그인 이벤트.

내부 응용 프로그램// global.php을 시작, 추가 다음 코드

Event::listen('auth.login', function($user) 
{ 
    $user->mdbid = $user->mdbid ?: str_random(16); 
    $user->key = $user->key ?: str_random(11); 

    Mdbid::create([ 
     'mdbid'  => $user->mdbid, 
     'table_number' => 7, 
     'table_name' => 'users', 
     'created_at' => Carbon::now(), 
     'updated_at' => Carbon::now() 
    ]); 

}); 

이 하나의 행을 보장하는 대신 동일한 ID로 새 행을 (추가하는, 성공적으로 로그인 당 Mdbid에 추가됩니다) 사용자 모델이 업데이트 될 때마다. (정말 싶었다 일명, 무엇을)


솔루션 # 3

각 테이블에는 기본 키 mdbid 있습니다. 새로운 행이 삽입 될 때마다 각 기본 키를 Mdbid 테이블에 추가해야합니다.

이 작업을 수행하는 방법은 Observer입니다.

class MdbidObserver 
{ 
    /** 
     * Observe new rows being added into the database 
     */ 
    public function creating($model) 
    { 
     // note that $model could be any model 
     $model->mdbid = $model->mdbid ?: str_random(16); 
     $model->key = $model->key ?: str_random(11); 

     Mdbid::create([ 
      'mdbid'  => $model->mdbid, 
      'table_number' => 7, 
      'table_name' => 'users', 
      'created_at' => Carbon::now(), 
      'updated_at' => Carbon::now() 
     ]); 
    } 
} 

두 번째 부분은 우리가 mdbid 추가하고 싶지는 모든 모델에 옵저버를 추가 : 첫 번째 부분은 우리가로 mdbid를 추가 할 모든 모델에 사용되는 새로운 옵저버 클래스를 추가 (app/start/global.php 내부)에 :

User::observe(new MdbidObserver); 
Artist::observe(new MdbidObserver); 
Album::observe(new MdbidObserver); 

이 mdbid에 문제를 중지하려면 실제로 이미 사용중인 임의되고, 당신은 단지 $ 모델 -> mdbid 전에 루프를 추가 할 수 없습니다. 비슷한 :

$isUnique = false; 
while (!$isUnique) 
{ 
    $unqiueId = str_random(16); 

    $row = Mdbid::where('mdbid', $uniqueId); 
    if (is_object($row)) 
     $isUnique = true; 
} 

$model->mdbid = $uniqueId; 
+0

MDBID를 설정 해제하고 싶지 않습니다. 사용자가 생성 될 때 MDBID 테이블 (사용 된 모든 MDBID를 저장하는 테이블)에 삽입되기를 원할뿐입니다. – Mike

+0

MDBID를 저장하는 코드는 어디에 두어야합니까? 언제 전화할까요? – Mike

+0

답변을 업데이트했습니다. – timgws

관련 문제