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)
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)
syncWithoutDetaching()平均需要 0.107 秒attachUniquePosts()平均需要 0.004 秒像这样的事情可能会奏效:
获取已附加的 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)