Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Laravel save / update many to many relationship

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 
like image 624
SuperManSL Avatar asked Jul 11 '14 16:07

SuperManSL


People also ask

What is Save () in Laravel?

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.


1 Answers

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] 
like image 160
Jarek Tkaczyk Avatar answered Sep 18 '22 21:09

Jarek Tkaczyk