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

时间:2017-02-17 20:47:14

标签: php laravel eloquent laravel-5.4

在我的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 但该对象已在上一次迭代中附加。怎么可能?感谢

1 个答案:

答案 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);
}

希望这有帮助!