Saltar al contenido

Laravel guarda / actualiza la relación de muchos a muchos

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *