Alguien me puede ayudar sobre cómo ahorrar muchos a muchos relación? He tareas, el usuario puede tener muchas tareas y puede tener muchos usuarios (muchos a muchos), Lo que quiero lograr es que en formulario de actualización de administrador puede asignar a varios usuarios a la tarea específica. Esto se hace a través de html select múltiple de entrada

name="taskParticipants[]"

El problema aquí es que a través del mismo formulario (input) usted puede agregar/eliminar usuarios, es por eso que tengo que usar sync().
Tal vez debería comenzar desde el principio, pero no sé por dónde empezar…

Este es mi modelo de Usuario:

public function tasks()
{
    return $this->belongsToMany('Task','user_tasks');
}

Tarea modelo

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

Esta es la estructura de las tablas de
tareas
id|título|fecha límite

user_tasks
id|task_id|user_id
  • He actualizado mi código. enlace
  • $workers = Input::get('taskParticipants'); $task->taskParticipants()->sync($workers); y eso es todo lo que necesita, el tiempo que pasa desde que se forma de todos los usuarios asignados a la tarea.
  • Gracias, Que era mágico.
InformationsquelleAutor SuperManSL | 2014-07-11

4 Comentarios

  1. 166

    tldr; Uso sync con 2 param false


    Muchos-a-muchos de relación 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');
    }

    En el fin de añadir una nueva relación con el uso de attach o sync.

    Diferencia entre los dos es:

    1 attach agregará una nueva fila en la tabla dinámica sin comprobar si ya está allí. Es bueno cuando se tienen datos adicionales vinculados a la relación, por ejemplo:

    User y Exam vinculados con la tabla dinámica attempts: id, user_id, exam_id, score

    Supongo que esto no es lo que usted necesita en su 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]

    2 sync por otro lado, le quite todas las relaciones y los puso 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 la instalación de nuevas relaciones sin separar anterior Y sin la adición de duplicados:

    $user->tasks()->sync([5,6,7,8], false); //2nd param = detach
    //then
    $user->tasks()->getRelatedIds(); //[1,2,3,4,5,6,7,8]
    • Sería bueno si que fue documentado en el principal docs lugar de la API de google docs! Rock en. +1.
    • Me gusta mucho la segunda solución con sync y 2do parámetro. Como dije en el comentario de abajo, yo no puede permitirse el lujo de no usar separar. La historia es que el administrador puede asignar la tarea a los usuarios. Él seleccione los usuarios de la lista desplegable (varios), es de campo de los participantes[]. Así que… : Paso 1: admin asigna Una tarea a los usuarios de tres (su método funciona, tenemos 3 los registros en DB) Paso 2: administrador de tareas actualizaciones de Una y agrega dos usuarios (su método funciona, tenemos 5 registros en DB) Paso 3: administración de actualizaciones de la tarea y la elimina 1 usuario (su método falla, todavía tenemos 5 usuarios en lugar de 4) mi método de actualización de mi código
    • Usted puede simplificar su relación de consulta a sólo $this->belongsToMany('User') si utiliza el nombre de la tabla en orden alfabético y singular (así task_user en lugar de user_tasks)
    • si siempre se pasa un array de todos los usuarios relacionados, a continuación, utilizar sync con separar, no se preocupe. Sugiero usar el 2º parámetro se establece a false cuando quieras a ‘añadir una nueva tarea para un usuario’ o ‘asignar usuario a una tarea, al pasar de una sola id de los modelos relacionados.
    • He actualizado mi pregunta, por favor, eche un vistazo
    • Es allí cualquier cosa para ‘oneToMany relación?
    • son similares en qué sentido?
    • nada como ‘sync’
    • sólo ->relation()->saveMany(array $models)
    • ¿Cómo saber si la sincronización o adjuntar ejecutó correctamente?
    • devuelve un array con detached, attached y updated listas. attach no devuelve nada, pero en ambos casos usted podría obtener una excepción si algo inesperado ocurre en la base de datos de llamadas.
    • genial, gracias por la sugerencia.

  2. 93

    He aquí mis notas sobre cómo guardar y actualizar la información sobre todos los Elocuente relaciones.

    en uno a Uno:

    Tienes que utilizar HasOne en el primer modelo y BelongsTo en el segundo modelo

    para agregar el registro en el primer modelo (HasOne) el uso de la guardar función

    ejemplo:    $post->comments()->save($comment);

    para agregar el registro en el segundo modelo (BelongsTo) el uso de la asociado función

    ejemplo:    $user->account()->associate($account);    $user->save();


    en de Uno a Muchos:

    Tienes que utilizar HasMany en el primer modelo y BelongsTo en el segundo modelo

    para agregar el registro de la primera tabla (HasMany) el uso de la guardar o saveMany funciones

    ejemplo:    $post->comments()->saveMany($comments);

    para agregar el registro en el segundo modelo (BelongsTo) el uso de la asociado función

    ejemplo:    $user->account()->associate($account);    $user->save();


    en de muchos a Muchos:

    Tienes que usar BelongsToMany en el primer modelo y BelongsToMany en el segundo modelo

    para agregar registros en la tabla dinámica de uso adjuntar o de sincronización funciones

    • tanto funciones acepta solo ID o matriz de ID 

    • la diferencia es adjuntar comprueba si el registro ya existe en la tabla dinámica, mientras que la sincronización no

    ejemplo: $user->roles()->attach($roleId);


    en Polimórficos de Uno a Muchos:

    Tiene que MorphMany en el modelo principal y MorphTo en todos los (***capacidad) modelos

    para agregar registros en todos los otros modelos de uso de la guardar

    ejemplo:    $course->tags()->save($tag);

    la tabla dinámica debe tener el siguiente columnas:

    . principales ID del modelo de

    . (***capacidad) ID

    . (***capacidad) Tipo de


    en Polimórficos de muchos a Muchos:

    Tiene que MorphByMany en el modelo principal y MorphToMany en todos los (***capacidad) modelos

    para agregar registros en todos los otros modelos de uso de la guardar o saveMany

    ejemplo:    $course->tags()->save($tag);

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

    la tabla dinámica debe tener el siguiente columnas:

    . principales ID del modelo de

    . (***capacidad) ID

    . (***capacidad) Tipo de


    en Tiene Muchos a Través de (acceso directo):

    Tienes que utilizar HasManyThrough en la primera tabla y las relaciones normales en las otras 2 tablas

    esto no funciona para ManyToMany relaciones (donde hay una tabla dinámica)

    sin embargo, hay un agradable y fácil solución para esto.


    He aquí un artículo que escribí inspirada en esta respuesta. Importante comprobar que: https://hackernoon.com/eloquent-relationships-cheat-sheet-5155498c209

    • esto debería haber más upvote
    • De hecho, me puso esta respuesta cuando ellos ya tenían más de 40 likes en la respuesta correcta, pero sí sé lo útil que esto es para mí, me alegro que te guste 🙂
    • Quiero que usted sepa que usted es un salvador
    • esta es una gran respuesta.
    • Muy útil, más upvotes ^
    • cómo actualizar uno de mayo de relación. u que se explica cómo agregar . podría por favor explicar la actualización también? hay un método para actualizar los registros como updateMany algo como eso? gracias

  3. 0

    La sync función borra la salida de relaciones y hace que su matriz la lista completa de las relaciones. Desea attach lugar para agregar relaciones sin quitar otros.

    • Yo no puedo utilizar adjuntar porque estoy usando este código dentro de método de actualización. La historia es que el administrador puede actualizar de la tarea y de relleno en la entrada de los participantes[] con los usuarios que van a participar en la tarea. Así que tengo que comprobar si existe y eliminar (o no agregar el nuevo registro) o si no existe añadir.
  4. 0

    syncWithoutDetaching([$id_one, $id_two, $id_three]); es lo que usted está buscando. En realidad, no la cosa exacta [sync con 2 param false] no!

Dejar respuesta

Please enter your comment!
Please enter your name here