2015-09-10 137 views
5

A User具有一個(或零)Company,而Company屬於一個且僅有一個User。我嘗試爲用戶保存公司,但每次重新觸發保存方法時,都會在數據庫中添加一個新條目。這是一對一的關係,所以我通過save方法User在Laravel中保存一對一關係

所以Company有一個方法user()

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

而且User有一個方法company()

public function company() { 
    return $this->hasOne(Company::class, 'user_id'); 
} 

我試圖挽救這樣的(所以創建或更新)用戶的公司(在控制器中):

$company = new Company(); 
$company->name = 'Test'; 
User::findOrFail(1)->company()->save($company); 

我第一次運行這段代碼時,它會在數據庫中創建條目(OK),但第二次爲同一用戶添加一個新條目(不正確)。我認爲它只會更新數據庫條目。

這是Laravel中的故障(或者我不明白的事情)或我做錯了什麼?(我認爲並希望它的第二個目的)

+0

檢查這個答案,它可以幫助你: http://stackoverflow.com/a/20764237/5122070 –

+0

謝謝,但我不知道它確實有助於爲這個特殊的問題。我的問題更具體。這是關於直接保存(創建或更新) –

回答

8

創建和更新需要區別對待。所以先檢查公司屬性的存在。

$user = User::with('company')->findOrFail(1); 
if ($user->company === null) 
{ 
    $company = new Company(['name' => 'Test']); 
    $user->company()->save($company); 
} 
else 
{ 
    $user->company->update(['name' => 'Test']); 
} 

注意hasOne()並不能保證你將有一個一對一的關係,它只是告訴雄辯如何創建查詢。它可以工作,即使你有多個Company指的是相同的User,在這種情況下,當你打電話給$user->company時,你將在數據庫的結果數據集中獲得第一個Company

+0

好的謝謝。 「請注意,hasOne()並不保證你將有一對一的關係,它只是告訴Eloquent如何創建查詢」 - >非常有幫助,現在已經很清楚了。 –

0

你做錯了

$company = new Company(); 
$company->name = 'Test'; 
User::findOrFail(1)->company()->save($company); 

你沒有告訴更新

這行,以便你的代碼必須是像這樣修改

$companyId爲貴公司更新

$company = new Company(); 
$company->name = 'Test'; 
User::findOrFail(1)->company()->find($companyId)->save($company); 
+0

但我不知道公司ID在這一點上,我只是想更新一個用戶的公司值(而不必關心可能的前一個)。 Maby這是不可能的,但似乎很奇怪'save()'不關心關係類型(這裏,它是一對一編碼的) –

+0

@ rap-2-h你有一個表單傳遞公司信息。如果用戶有公司信息,那麼會有一個ID,如果沒有,那麼你留下id爲空,當你發佈表單時,你會得到id。現在,如果您找到並更新了id值,或者您插入了該值。 –

+0

好的謝謝。我知道這是一種在表單中使用隱藏字段的解決方案,但我的問題是我們應該這樣做嗎? Laravel知道它只能爲一個用戶提供一個公司,所以爲什麼當我保存它時會添加一個新公司。這看起來很奇怪(好像它不尊重所宣稱的),所以我認爲我做錯了方式。 –

4
$user = User::findOrFail(1); 
$company = $user->company ?: new Company; 
$company->name = 'Test'; 
$user->company()->save($company); 
+0

也是這樣的!快速,乾淨! +1 :) –