2014-06-05 3 views
0

새 사용자를 저장하고 syncing 많은 관계를 새로 만들면 새로 만든 사용자의 ID가 sync() 메서드로 전달되지 않는 것 같이 무결성 제약 조건 오류가 발생합니다. 여기 내 store 컨트롤러 방법 :많은 관계를 저장할 때 Laravel 무결성 제약 조건 위반

$user = new User; 
$user->name = Input::get('name'); 
$user->username = Input::get('username'); 
$user->email = Input::get('email'); 
$user->password = Input::get('password'); 
$user->save(); 

// See if roles are passed, if not assign the default role of "view_site" 
$roles = Input::has('roles') ? Input::get('roles') : [3]; 
$user->roles()->sync($roles); 

당신은 내가 그것이 ID가 있어야하므로 sync에 관련 데이터를 시도하기 전에 save()를 호출 볼 수 있듯이. 나는 그것이 잘 작동 이미 존재하는 사용자 (User::find($id)->roles()->sync([1,2,3]))에 동기화 방법을 실행하는 경우

Integrity constraint violation: 1048 Column 'user_id' cannot be null (SQL: insert into users_roles (role_id , user_id) values (3,))

다음은 오류입니다. 참고로

, 관계 :

// User.php 
public function roles() 
{ 
    return $this->belongsToMany('Role', 'users_roles'); 
} 
// Role.php 
public function users() 
{ 
    return $this->belongsToMany('User', 'users_roles'); 
} 

편집 : sync() 이전에

쿼리 로그. save() 같은데는

Array 
(
    [0] => Array 
     (
      [query] => select * from `users` where `id` = ? limit 1 
      [bindings] => Array 
       (
        [0] => 1 
       ) 

      [time] => 0.63 
     ) 

    [1] => Array 
     (
      [query] => select `roles`.*, `users_roles`.`user_id` as `pivot_user_id`, `users_roles`.`role_id` as `pivot_role_id` from `roles` inner join `users_roles` on `roles`.`id` = `users_roles`.`role_id` where `users_roles`.`user_id` = ? 
      [bindings] => Array 
       (
        [0] => 1 
       ) 

      [time] => 0.58 
     ) 

    [2] => Array 
     (
      [query] => select count(*) as aggregate from `users` where `email` = ? or `username` = ? 
      [bindings] => Array 
       (
        [0] => [email protected]le.com 
        [1] => example 
       ) 

      [time] => 0.48 
     ) 

) 
+0

을 사용할 수 있습니다

if($user->save()); $roles = Input::has('roles') ? Input::get('roles') : [3]; $user->roles()->sync($roles); }else{ return Redirect::back()->withErrors($user->errors()); } 

당신의 store 방법에서 , if 문을 추가) -> roles() -> sync ($ roles);'같은 오류가 발생합니까? – Razor

+0

아니요, 완벽하게 작동합니다 – harryg

+0

아마도'Ardent' (저장시 자동 유효성 검사)를 사용하고있을 것이므로'$ user-> save();을 호출하면 아무 일도 일어나지 않습니다. 어떤 식 으로든, 마지막에 var_dump ('DB :: getQueryLog()')'를 추가하고 결과를 공유하십시오. – Razor

답변

2

당신이 confide을 사용하고 있기 때문에이 검증은 Ardent을 기반으로 ... 데이터베이스에 기록되지 않습니다. 당신은`실행 사용자 : 찾을 경우 ($ validId를 : 유효성 검사를 점검 할 필요가없는 경우, 당신은 그냥 디버깅을 위해

$user->forceSave(); 
+0

이 제안에 감사드립니다. 유효성 검사 오류입니다. 어쨌든'if (Validator :: make (Input :: all(), User :: $ rules) -> passes())'를 사용하여 유효성 검사기를 실행합니다. 그러나 코드를 추가하면 암호 확인 불일치가있는 것 같습니다. 내 양식에'password_confirmation' 입력을 포함 시켰습니다. – harryg

+0

'$ user-> password_confirmation = Input :: get ('password_confirmation ');도 열심히해야합니까? – harryg

+0

추가해야 할 것으로 보입니다. '$ rules'을 보여주십시오. – Razor

관련 문제