如果他们尚未附加关系,是否可以快速添加关系。我正在使用此代码更新模型的关系;
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'));
}
但我收到此错误,我是这个错误;
SQLSTATE [23000]:完整性约束违规:1062重复条目' 1-41'关键' PRIMARY' (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'));
答案 0 :(得分:16)
Laravel有内置的方法 - syncWithoutDetaching:
$message->Users()->syncWithoutDetaching($request->get('users'));
答案 1 :(得分:1)
这样的事可能有用:
获取已附加的ID:
$attachedIds = $message->Users()->whereIn('id', $request->get('users'))->pluck('id');
从请求数组中删除附加的ID:
$newIds = array_diff($request->get('users'), $attachedIds);
附加新ID:
$message->Users()->attach($newIds);
答案 2 :(得分:1)
在代码中使用syncWithoutDetaching
或sync([arr], false)
看起来更简洁,但执行速度比attach()
慢25倍。这是因为它检查每个id并针对每个项目执行单独的数据库插入。
我建议通过扩展口才或在模型类上创建新方法来建立在Paul Spiegel's answer上。
在我的用例中,我有一个Feed
类和一个Post
类,它们通过多对多枢纽链接在一起。我在Feed类中添加了以下方法。
public function attachUniquePosts($ids)
{
$existing_ids = $this->posts()->whereIn('posts.id', $ids)->pluck('posts.id');
$this->posts()->attach($ids->diff($existing_ids));
}
syncWithoutDetaching()
将20条帖子添加到Feed中,平均花费了
0.107秒attachUniquePosts()
平均花费0.004秒