Laravel 关系附加(如果尚未附加)

2022-08-30 14:02:04

有没有一种快速的方法来附加关系,如果它们还没有附加。我正在使用此代码来更新模型的关系;

        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: 插入到 (, ) 值 (1, 41), (1, 42), (1, 43), (1, 44), (1, 45), (1, 46), (1, 47), (1, 48), (1, 49), (1, 50))message_usermessage_iduser_id

我想避免通过一个非常长的数组列表来检查哪些用户尚未附加并附加它们。也让我知道这是否是唯一的方法。

我在想这样的事情;

$message->Users()->attachIfNotAttached($request->get('users'));

答案 1

Laravel为此内置了方法 - syncWithoutDetaching

$message->Users()->syncWithoutDetaching($request->get('users'));

答案 2

在代码中使用 或 看起来更干净,但执行速度比 慢 25 倍。这是因为它检查每个 ID 并为每个项目执行单独的数据库插入。syncWithoutDetachingsync([arr], false)attach()

我建议以保罗·斯皮格尔(Paul Spiegel)的答案为基础,扩展雄辩性或在模型类上创建新方法。

在我的用例中,我有一个类和一个由多对多枢轴链接的类。我将以下方法添加到我的 Feed 类中。FeedPost

public function attachUniquePosts($ids)
{
    $existing_ids = $this->posts()->whereIn('posts.id', $ids)->pluck('posts.id');
    $this->posts()->attach($ids->diff($existing_ids));
}
  • 使用将 20 个帖子附加到源平均花费 0.107 秒syncWithoutDetaching()
  • 使用将 20 个帖子附加到源平均需要 0.004 秒attachUniquePosts()

推荐