Can anyone help me on how to save many to many relationship? I have tasks, user can have many tasks and task can have many users (many to many), What I want to achieve is that in update form admin can assign multiple users to specific task. This is done through html multiple select input
name="taskParticipants[]"
The catch here is that through the same form (input) you can add/remove users, that's why I have to use sync(). Maybe I should start from the beginning but don't know where to start...
This is my User model:
public function tasks() { return $this->belongsToMany('Task','user_tasks'); }
Task model
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)); } } }
This is structure of tables tasks id|title|deadline
user_tasks id|task_id|user_id
save() save() method is used both for saving new model, and updating existing one. here you are creating new model or find existing one, setting its properties one by one and finally saves in database.
tldr; Use sync
with 2nd param false
Many-to-many relationship is belongsToMany
on both models:
// 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'); }
In order to add new relation use attach
or sync
.
Difference between the two is:
1 attach
will add new row on the pivot table without checking if it's already there. It's good when you have additional data linked to that relation, for example:
User
and Exam
linked with pivot table attempts: id, user_id, exam_id, score
I suppose this is not what you need in your situation:
$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
on the other hand, will either remove all relations and set them up anew:
$user->tasks()->getRelatedIds(); // [1,2,3,4,5,6] $user->tasks()->sync([1,2,3]); // then $user->tasks()->getRelatedIds(); // [1,2,3]
or it will setup new relations without detaching previous AND without adding duplicates:
$user->tasks()->sync([5,6,7,8], false); // 2nd param = detach // then $user->tasks()->getRelatedIds(); // [1,2,3,4,5,6,7,8]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With