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但对象已经在先前的迭代中连接。这怎么可能?谢谢
答
你上面代码不工作的原因是因为你没有为每个检查创建一个新的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);
}
希望这有助于!
你能发布这个动作的控制器功能吗? –
发布你的模型,你已经定义了关系。 –