如果尚未附加Laravel关系附加

6 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'));
        }
Run Code Online (Sandbox Code Playgroud)

但我得到这个错误,我是这个错误;

SQLSTATE [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'));
Run Code Online (Sandbox Code Playgroud)

Kar*_*rim 32

Laravel有内置的方法 - syncWithoutDetaching:

$message->Users()->syncWithoutDetaching($request->get('users'));
Run Code Online (Sandbox Code Playgroud)

  • Laravel 的同步方法有一个显着的限制,因为它们不支持额外的数据透视表数据,但 Attach 可以。因此,如果您有一个带有额外列的数据透视表,那么使用 `syncWithoutDetaching` 就不是一个选项了。相反,您必须遵循已接受的答案。 (4认同)
  • @ behz4d这正是OP想要的。它会将请求中的所有用户附加到尚未附加的消息。“ WithoutDetaching”部分可确保没有分离未包含在请求中的用户。 (3认同)
  • 这与 OP 问题无关,此同步但 OP 想要附加 (2认同)

Kie*_*iee 13

在代码中使用syncWithoutDetachingorsync([arr], false)看起来更简洁,但执行速度attach(). 这是因为它检查每个 id 并为每个项目执行单独的数据库插入。

我建议通过扩展 eloquent 或在模型类上创建新方法来构建Paul Spiegel 的答案

在我的用例中,我有一个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));
}
Run Code Online (Sandbox Code Playgroud)
  • 使用将 20 个帖子附加到提要syncWithoutDetaching()平均需要 0.107 秒
  • 使用将 20 个帖子附加到提要 attachUniquePosts()平均需要 0.004 秒


Pau*_*gel 6

像这样的事情可能会奏效:

获取已附加的 ID:

$attachedIds = $message->Users()->whereIn('id', $request->get('users'))->pluck('id');
Run Code Online (Sandbox Code Playgroud)

从请求数组中删除附加的 ID:

$newIds = array_diff($request->get('users'), $attachedIds);
Run Code Online (Sandbox Code Playgroud)

附加新 ID:

$message->Users()->attach($newIds);
Run Code Online (Sandbox Code Playgroud)