2014-09-19 3 views
0

두 가지 모델 'User'와 'Profile'이 있습니다.Laravel - OneToOne 관계 업데이트

'이메일'필드는 사용자 모델에있는 반면 '이름'필드는 프로필 모델에 있습니다.

'프로필'테이블에 'user_id'외래 키가 있습니다.

많은 검색을했지만 한 번에 이러한 항목을 모두 업데이트 할 수있는 방법에 대한 적절한 해결책을 찾지 못했습니다.

내 ProfileController에서이 작업을 수행하고 있지만 더 나은 방법이 있다고 확신합니다. 도와주세요.

public function update($id) 
{ 
    $profile = Profile::where('id', $id); 
    $profile->name = 'Jon'; 
    $profile->save(); 

    $user = User::where('id', $profile->user_id); 
    $user->email = '[email protected]'; 
    $user->save(); 
} 

내 프로필 모델은

public function user() 
{ 
    return $this->belongsTo('User'); 
} 

을 가지고 그리고 내 사용자 모델은

public function profile() 
{ 
    return $this->hasOne('Profile'); 
} 
+0

그럼 데이터베이스 트리거를 사용할 수 있습니다. –

+0

프로필에 사용자와 hasOne 관계가 있고 이미 프로필을 찾은 경우 $ profile-> user로 사용자를 가져올 수 있습니다. 어떤 점에서 다른 SQL 쿼리를 저장합니다. – Adimeus

+0

또 다른 것은 일대일 관계가 별개의 테이블에 있다는 것은별로 의미가 없다는 것입니다. –

답변

4

당신은 한 번에 그것을 할 수있다.

당신이이 같은 Laravel 기능을 활용하여 조금 단순화 할 수 그러나 (그리고 그것을 할 한 이동 같은 방법) :

1 컨트롤러 편집

$profile = Profile::with('user')->find($id); 
// make sure you eager load the user for below to work 

2 보기

{{ Form::model($profile) }} 
    {{ Form::text('name') }} 
    {{ Form::text('user[email]') }} 
{{ Form::close() }} 

이 (너무 및 사용자 데이터) 프로필 데이터를 자동으로 채운 것이다

3 컨트롤러 업데이트 또한

$profile = Profile::find($id); 
$profile->fill(Input::only(.. fields you want to update ..)); 
$profile->user->fill(Input::get('user')); // array of user data form the form 
$profile->push(); // save both models in one go BUT separate queries 

당신이 당신의 모델 fillable이 있는지 확인, 그래서 fill 의지는 일을한다.


또 다른 방법은 model events을 사용하는 것이지만 나는 그렇게하지 않을 것입니다.

+0

예, push()가 필요한 것입니다. 나는 그것들을 문서에서 읽었지 만 그것을 사용하는 방법에 대해서는 분명하지 않았다. 고마워. – aBhijit

+0

아무런 문제가 없습니다. ** 여러 가지 모델을 삽입하기 위해 푸시를 사용할 수 없습니다 ** ** 똑같은 방법입니다. 기존 모델에서만 작동합니다. –

+0

'기존'은 '관련'모델을 의미합니까? – aBhijit