2014-09-19 81 views
0

我有兩個模型'用戶'和'配置文件'。Laravel - 更新OneToOne關係

'email'字段位於User模型中,而'name'字段位於Profile模型中。

'profiles'表具有'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

那麼你可以使用數據庫觸發器。 – 2014-09-19 10:06:34

+0

如果配置文件與用戶具有hasOne關係,並且您已經找到配置文件,則可以通過$ profile-> user獲取用戶;從哪個角度講,可以節省您另一個SQL查詢。 – Adimeus 2014-09-19 10:07:31

+0

另一件事是一對一的關係在分開的表格中沒有多大意義。 – 2014-09-19 10:12:53

回答

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 2014-09-19 10:45:42

+0

沒有問題,只是介意**您不能使用push以相同的方式插入多個模型**。它只適用於現有的型號。 – 2014-09-19 10:47:13

+0

按「存在」,你的意思是「相關」模型的權利? – aBhijit 2014-09-19 10:49:25