Laravel - 在多对多关系中找不到()附加对象

问题描述:

在我的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

发布你的模型,你已经定义了关系。 –

你上面代码不工作的原因是因为你没有为每个检查创建一个新的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); 
} 

希望这有助于!