Laravel保存/更新多对多的关系
任何人都可以帮助我如何保存多对多的关系? 我有任务,用户可以有很多任务,任务可以有很多用户(多对多),我想要实现的是在更新表单pipe理员可以分配多个用户到特定的任务。 这是通过html多selectinput完成的
name="taskParticipants[]"
这里的问题是通过相同的表单(input)可以添加/删除用户,这就是为什么我必须使用sync()。 也许我应该从头开始,但不知道从哪里开始…
这是我的用户模式:
public function tasks() { return $this->belongsToMany('Task','user_tasks'); }
任务模型
public function taskParticipants() { return $this->belongsToMany('User','user_tasks'); }
TaskController
public function update($task_id) { if (Input::has('taskParticipants')) { foreach(Input::get('taskParticipants') as $worker) { $task2 = $task->taskParticipants->toArray(); $task2 = array_add($task2,$task_id,$worker); $task->taskParticipants()->sync(array($task2)); } } }
这是表任务结构的标题|截止date
user_tasks id|task_id|user_id
tldr; 与第二个参数sync
使用false
在这两种模式中,多对多的关系都属于belongsToMany
:
// Task model public function users() { return $this->belongsToMany('User', 'user_tasks'); // assuming user_id and task_id as fk } // User model public function tasks() { return $this->belongsToMany('Task', 'user_tasks'); }
为了添加新的关系使用attach
或sync
。
两者的区别在于:
1 attach
将在数据透视表上添加新行,而不检查它是否已经存在。 当你有额外的数据链接到这个关系,例如:
User
和Exam
链接到数据透视表attempts: id, user_id, exam_id, score
我想这不是你所需要的:
$user->tasks()->getRelatedIds(); // [1,2,3,4,5,6] $user->tasks()->attach([5,6,7]); // then $user->tasks()->getRelatedIds(); // [1,2,3,4,5,6,5,6,7]
2另一方面sync
,将要么删除所有的关系,并重新设置:
$user->tasks()->getRelatedIds(); // [1,2,3,4,5,6] $user->tasks()->sync([1,2,3]); // then $user->tasks()->getRelatedIds(); // [1,2,3]
或者它将build立新的关系,而不需要先前的分离和不添加重复:
$user->tasks()->sync([5,6,7,8], false); // 2nd param = detach // then $user->tasks()->getRelatedIds(); // [1,2,3,4,5,6,7,8]
以下是关于如何保存和更新所有Eloquent关系的笔记。
一对一 :
您必须在第一个模型上使用HasOne ,在第二个模型上使用BelongsTo
在第一个模型( HasOne )上添加logging使用保存function
例如: $post->comments()->save($comment);
在第二个模型( BelongsTo )上添加logging使用关联function
例如: $user->account()->associate($account); $user->save();
$user->account()->associate($account); $user->save();
一对多 :
您必须在第一个模型上使用HasMany ,在第二个模型上使用BelongsTo
在第一个表( HasMany )上添加logging使用save或saveMany函数
例如: $post->comments()->saveMany($comments);
在第二个模型( BelongsTo )上添加logging使用关联function
例如: $user->account()->associate($account); $user->save();
$user->account()->associate($account); $user->save();
在多对多 :
您必须在第一个模型上使用BelongsToMany ,在第二个模型上使用BelongsToMany
在数据透视表上添加logging使用附加或同步function
-
这两个函数都接受单个ID或ID的数组
-
不同的是附加检查,如果logging已经存在于数据透视表而同步不存在
例如: $user->roles()->attach($roleId);
多态一对多 :
你必须在主模型上使用MorphMany ,在所有(*** able)模型上使用MorphTo
在所有其他模型上添加logging使用保存
例如: $course->tags()->save($tag);
数据透视表应该有以下列:
。 主要型号ID
。 (***)ID
。 (*** able)types
多态多对多 :
您必须在主模型上使用MorphByMany ,在所有(*** able)模型上使用MorphToMany
在所有其他模型上添加logging使用save或saveMany
例如: $course->tags()->save($tag);
例如: $course->tags()->saveMany([$tag_1, $tag_2, $tag_3]);
数据透视表应该有以下列:
。 主要型号ID
。 (***)ID
。 (*** able)types
有很多通过 (快捷键):
您必须在第一个表上使用HasManyThrough ,并在其他两个表上具有常规关系
这不适用于ManyToMany关系(有一个数据透视表)
然而,这是一个很好的和简单的解决scheme。
sync
function消除了退出的关系,使您的数组完整的关系列表。 你要attach
而不是删除别人添加关系。