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);
}
希望对您有所帮助!
在我的 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);
}
希望对您有所帮助!