2017-02-17 114 views
0

在我的POST表單中,用戶可以將其他用戶添加到房間中。 我對鏈接施加了一個唯一的約束(用戶和房間之間的鏈接中沒有重複條目)。 然而,當我在提交表單後刷新頁面(f5)時,Laravel抱怨重複的條目,儘管我確實檢查了是否以前連接了對象。Laravel - 在多對多關係中找不到()附加對象

下面的代碼:

$roomUsers = Room::find($request->room_id)->users(); 

if ($request->add != null) { 
    foreach ($request->add as $uId) 
     // if null, user hasnt been attach yet 
     if (!$roomUsers->find($uId)) { 
      Log::debug($roomUsers->find($uId) == null ? 'null' : 'not null'); 
      // then we can attach him 
      $roomUsers->attach($uId); 
     } 
} 

!$roomUsers->find($uId)返回true但對象已經在先前的迭代中連接。這怎麼可能?謝謝

+0

你能發佈這個動作的控制器功能嗎? –

+0

發佈你的模型,你已經定義了關係。 –

回答

1

你上面代碼不工作的原因是因爲你沒有爲每個檢查創建一個新的BelongsToMany實例。這意味着每次您致電find時,實際上並沒有創建一個新的查詢,而只是將其添加到現有的查詢中。

說你的ID添加是[1, 2, 3]通過最後檢查您的查詢將有效地:

SELECT * FROM users WHERE id = 1 AND id = 2 AND id = 3 

爲了保持上述的邏輯,你可以這樣做:

$room = Room::find($request->room_id); 

if ($request->add != null) { 
    foreach ($request->add as $uId) 
     // if null, user hasnt been attach yet 
     if (!$room->users()->find($uId)) { 
      // then we can attach him 
      $room->users()->attach($uId); 
     } 
} 

或者一個更簡單這種方式去syncWithoutDetaching。然後

你的代碼可能看起來是這樣的:

$roomUsers = Room::find($request->room_id); 

if ($request->has('add')) { 
    $roomUsers->users()->syncWithoutDetaching($request->add); 
} 

希望這有助於!