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'); } 

为了添加新的关系使用attachsync

两者的区别在于:

1 attach将在数据透视表上添加新行,而不检查它是否已经存在。 当你有额外的数据链接到这个关系,例如:

UserExam链接到数据透视表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使用savesaveMany函数

例如: $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


多态多对多

您必须在主模型上使用MorphBy​​Many ,在所有(*** able)模型上使用MorphToMany

在所有其他模型上添加logging使用savesaveMany

例如: $course->tags()->save($tag);

例如: $course->tags()->saveMany([$tag_1, $tag_2, $tag_3]);

数据透视表应该有以下列:

。 主要型号ID

。 (***)ID

。 (*** able)types


有很多通过 (快捷键):

您必须在第一个表上使用HasManyThrough ,并在其他两个表上具有常规关系

这不适用于ManyToMany关系(有一个数据透视表)

然而,这是一个很好的和简单的解决scheme。

syncfunction消除了退出的关系,使您的数组完整的关系列表。 你要attach而不是删除别人添加关系。