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

Laravel - can't find() attached object in many-to-many relationship

在我的 POST 表单中,用户可以将其他用户添加到房间。 我对 link 设置了唯一约束(在用户和房间之间的 link 中没有重复条目)。 然而,当我在提交表单后刷新我的页面 (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) returns 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);
}

希望对您有所帮助!