如果尚未连接,则连接Laravel关系

tzxcd3kk  于 2023-03-09  发布在  其他
关注(0)|答案(5)|浏览(142)

有没有一个快速的方法来附加关系,如果他们还没有附加。我用这个代码来更新一个模型的关系;

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_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'));
14ifxucb

14ifxucb1#

Laravel为此提供了内置方法- syncWithoutDetaching:

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

eoigrqb62#

使用syncWithoutDetachingsync([arr], false)在代码中看起来更简洁,但是**的执行速度比attach()慢25倍,这是因为它检查每个id,并对每个项目执行单独的数据库插入。
我建议在PaulSpiegel的答案的基础上扩展elvent或在您的模型类上创建一个新方法。
在我的用例中,我有一个Feed类和一个Post类,它们通过多对多透视链接。

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

hgncfbus3#

类似这样的方法可能有效:
获取已附加的ID:

$attachedIds = $message->Users()->whereIn('id', $request->get('users'))->pluck('id');

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

$newIds = array_diff($request->get('users'), $attachedIds);

附上新ID:

$message->Users()->attach($newIds);
gblwokeq

gblwokeq4#

信息:似乎syncWithoutDetaching()是不工作的亚马逊极光MySQL

yyyllmsg

yyyllmsg5#

你可以使用detach来确认,然后你可以像这样使用attach函数:

$handleUserMoving = function ($message) use($user) {
        $message->Users()->detach($user);
        if (!$message->Users()->where('users.id', $user->id)->exists()) 
        {
            $message->Users()->attach($user);
        }
};
$message->Users()->each($handleUserMoving);

相关问题