Si te encuentras con alguna parte que no entiendes puedes dejarlo en los comentarios y te ayudaremos tan rápido como podamos.
Solución:
tldr; Usar sync
con 2do parámetro false
La relación de muchos a muchos es belongsToMany
en ambos modelos:
// 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');
Para agregar una nueva relación, use attach
o sync
.
La diferencia entre los dos es:
1attach
agregará una nueva fila en la tabla dinámica sin verificar si ya está allí. Es bueno cuando tiene datos adicionales vinculados a esa relación, por ejemplo:
User
y Exam
vinculado con la tabla dinámica attempts: id, user_id, exam_id, score
Supongo que esto no es lo que necesitas en tu situación:
$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]
2sync
por otro lado, eliminará todas las relaciones y las configurará de nuevo:
$user->tasks()->getRelatedIds(); // [1,2,3,4,5,6]
$user->tasks()->sync([1,2,3]);
// then
$user->tasks()->getRelatedIds(); // [1,2,3]
o configurará nuevas relaciones sin separar Y sin agregar duplicados:
$user->tasks()->sync([5,6,7,8], false); // 2nd param = detach
// then
$user->tasks()->getRelatedIds(); // [1,2,3,4,5,6,7,8]
Aquí están mis notas sobre cómo guardar y actualizar todas las relaciones de Eloquent.
en Doce y cincuenta y nueve de la noche:
Tienes que usar Tiene uno en el primer modelo y Pertenece a en el segundo modelo
para agregar registro en el primer modelo (Tiene uno) utilizar el ahorrar función
ejemplo: $post->comments()->save($comment);
para agregar registro en el segundo modelo (Pertenece a) utilizar el asociar función
ejemplo: $user->account()->associate($account); $user->save();
en Uno a muchos:
Tienes que usar Tiene muchos en el primer modelo y Pertenece a en el segundo modelo
para agregar registro en la primera tabla (Tiene muchos) utilizar el ahorrar o saveMany funciones
ejemplo: $post->comments()->saveMany($comments);
para agregar registro en el segundo modelo (Pertenece a) utilizar el asociar función
ejemplo: $user->account()->associate($account); $user->save();
en Muchos a muchos:
Tienes que usar Pertenece a muchos en el primer modelo y Pertenece a muchos en el segundo modelo
para agregar registros en la tabla dinámica, use adjuntar o sincronizar funciones
-
Ambas funciones aceptan un solo ID o array de identificaciones
-
la diferencia es adjuntar verificaciones si el registro ya existe en la tabla dinámica mientras que la sincronización no
ejemplo: $user->roles()->attach($roleId);
en Polimórfico uno a muchos:
Tienes que usar MorphMany en el modelo principal y MorphTo en todos los modelos (*** capaces)
para agregar registros en todos los otros modelos use el ahorrar
ejemplo: $course->tags()->save($tag);
la tabla dinámica debe tener las siguientes columnas:
. ID del modelo principal
. (*** capaz) ID
. (*** capaz) Tipo
en Muchos a muchos polimórficos:
Tienes que usar MorphByMany en el modelo principal y MorphToMany en todos los modelos (*** capaces)
para agregar registros en todos los otros modelos use el ahorrar o saveMany
ejemplo: $course->tags()->save($tag);
ejemplo: $course->tags()->saveMany([$tag_1, $tag_2, $tag_3]);
la tabla dinámica debe tener las siguientes columnas:
. ID del modelo principal
. (*** capaz) ID
. (*** capaz) Tipo
en Tiene muchos a través (atajo):
Tienes que usar HasManyThrough en la primera mesa y tienen las relaciones normales en las otras 2 mesas
esto no funciona para Muchos a muchos relaciones (donde hay una tabla dinámica)
sin embargo, existe una solución sencilla y agradable para eso.
Aquí hay un artículo que escribí, inspirado por esta respuesta. Importante comprobarlo: https://hackernoon.com/eloquent-relationships-cheat-sheet-5155498c209
syncWithoutDetaching([$id_one, $id_two, $id_three]);
es lo que estas buscando. De hecho, hace exactamente lo mismo [sync
with 2nd param false
] ¡lo hace!
Acuérdate de que tienes concesión de parafrasear si diste con la contestación.