Php 拉威尔-can';在多对多关系中找不到()附加对象

Php 拉威尔-can';在多对多关系中找不到()附加对象,php,laravel,eloquent,laravel-5.4,Php,Laravel,Eloquent,Laravel 5.4,在我的帖子表单中,用户可以向文件室添加其他用户。 我在链接上设置了一个唯一的约束(在用户和房间之间的链接中没有重复的条目)。 但是,当我在提交表单后刷新页面(f5)时,Laravel会抱怨重复条目,尽管我确实检查了对象之前是否已附加 代码如下: $roomUsers = Room::find($request->room_id)->users(); if ($request->add != null) { foreach ($request->add as $u

在我的帖子表单中,用户可以向文件室添加其他用户。 我在链接上设置了一个唯一的约束(在用户和房间之间的链接中没有重复的条目)。 但是,当我在提交表单后刷新页面(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,但对象已在上一次迭代中附加。这怎么可能?谢谢

您上面的代码不起作用的原因是您没有为每个检查创建
belongToMany
的新实例。这意味着每次调用
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);
        }
}
或者更简单的方法是在不分离的情况下进行
同步

然后,您的代码可能看起来像:

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

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

希望这有帮助

您可以发布此操作的控制器功能吗?也发布您的模型,在其中定义了关系。