2015-11-18 45 views
0

我的User模型與另外一個UserInformation模型之間存在一對一的關係,在這個模型中我存儲了額外需要的信息,這些信息會使「普通」用戶表。流利地更新現有的與Laravel 5中的一對一關係

設置我的模型是這樣的:

# User.php 

public function information() 
{ 
    return $this->hasOne(UserInformation::class); 
} 

# UserInformation.php 

public function user() 
{ 
    $this->belongsTo(User::class); 
} 

我有一個個人資料頁面,用戶可以更新這兩個表的信息。

視圖有這樣的輸入:

<input name="email"> // is a field in the users-table 
<input name="information[size]"> // is a field in the users-information table 

我在不同的地點讀,我應該能救我的兩個User模型及其關係在:

$user->fill($request->all())->save(); 

但是,這將引發出現以下錯誤:

preg_replace(): Parameter mismatch, pattern is a string while replacement is an array 

所以我當前的解決方案如下所示:

auth()->user() 
     ->fill($request->except('information')) 
     ->save(); 

auth()->user() 
     ->information 
     ->fill($request->input('information')) 
     ->save(); 

這樣做效果很好,但在我看來並不好。所以我的問題是:我怎樣才能清理代碼並一次性保存?

回答

1

您是否嘗試過包括本

protected $guarded = array('information'); 
User.php模型文件

然後

auth()->user() 
     ->fill($request->all()) 
     ->information->fill($request->input('information')) 
     ->save(); 
+0

這不起作用,因爲'User'模型永遠不會被保存。用'guard'屬性關閉''except'方法正在工作,但我認爲除了看起來更乾淨。 – Tim

0

我認爲你目前的解決方案看起來很好,但如果你想,你總是可以在用戶模型中將其解壓縮到您自己的自定義方法中。

public function saveWithInformation($attributes) 
{ 
    $this->fill($attributes)->save(); 
    $this->information->fill($attributes['information'])->save(); 
} 

然後,你可以致電:

auth()->user()->saveWithInformation($request->all()); 
+0

嗨托馬斯。感謝你,我知道我可以將我的代碼的這部分提取到一個新的函數,不幸的是,這不是我尋找的靈活性,因爲它不是很可重用。由於我無法在框架中找到解決方案,因此我提出了自己的解決方案,並將其發佈爲答案。再次感謝! – Tim

0

因爲我一直在尋找我想出了這個功能,我實現了我的User模型一個非常靈活的解決方案(但它也可以被納入一BaseModel

,如果你有像職位的hasOne關係的信息。這肯定是工作在我的問題編輯。