有没有一个快速的方法来附加关系,如果他们还没有附加。我用这个代码来更新一个模型的关系;
if (!empty($request->get('roles')) && is_array($request->get('roles'))) {
$message->Roles()->attach($request->get('roles'));
}
if (!empty($request->get('users')) && is_array($request->get('users'))) {
$message->Users()->attach($request->get('users'));
}
但是我得到了这个错误,我就是这个错误;
数据库状态[23000]:完整性约束冲突:1062关键字'PRIMARY'的条目'1 - 41'重复(SQL:插入到message_user
(message_id
,user_id
)值(1,41)、(1,42)、(1,43)、(1,44)、(1,45)、(1,46)、(1,47)、(1,48)、(1,49)、(1,50)中)
我想避免通过一个很长的数组列表检查哪些用户还没有连接和连接他们。也让我知道这是唯一的方法。
我在想,
$message->Users()->attachIfNotAttached($request->get('users'));
5条答案
按热度按时间14ifxucb1#
Laravel为此提供了内置方法- syncWithoutDetaching:
eoigrqb62#
使用
syncWithoutDetaching
或sync([arr], false)
在代码中看起来更简洁,但是**的执行速度比attach()
慢25倍,这是因为它检查每个id,并对每个项目执行单独的数据库插入。我建议在PaulSpiegel的答案的基础上扩展elvent或在您的模型类上创建一个新方法。
在我的用例中,我有一个
Feed
类和一个Post
类,它们通过多对多透视链接。syncWithoutDetaching()
将20个帖子附加到一个提要平均耗时0.107秒attachUniquePosts()
将20个帖子附加到一个提要平均花费0.004秒hgncfbus3#
类似这样的方法可能有效:
获取已附加的ID:
从请求数组中删除附加的ID:
附上新ID:
gblwokeq4#
信息:似乎
syncWithoutDetaching()
是不工作的亚马逊极光MySQLyyyllmsg5#
你可以使用detach来确认,然后你可以像这样使用attach函数: