如果尚未附加Laravel关系附加

时间:2017-07-27 16:44:55

标签: php mysql laravel laravel-5.4

如果他们尚未附加关系,是否可以快速添加关系。我正在使用此代码更新模型的关系;

        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_usermessage_iduser_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'));

3 个答案:

答案 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)

在代码中使用syncWithoutDetachingsync([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秒
  • 使用以下方式将20条帖子添加到供稿 attachUniquePosts()平均花费0.004秒