在我的POST表单中,用户可以将其他用户添加到房间。 我在链接上放置了一个唯一的约束(用户和房间之间的链接没有重复的条目)。 但是,当我在提交表单后刷新页面(f5)时,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 :(得分: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);
}
希望这有帮助!