Recuperando todas las relaciones morphedByMany en Laravel Eloquent

3 minutos de lectura

avatar de usuario
andres willis

En la documentación de Laravel, hay el siguiente ejemplo para recuperar morphedByMany relaciones, que son relaciones polimórficas de muchos a muchos.

Documentación de relaciones polimórficas de Laravel Many to Many

namespace App;

use Illuminate\Database\Eloquent\Model;

class Tag extends Model
{
    /**
     * Get all of the posts that are assigned this tag.
    */
    public function posts()
    {
        return $this->morphedByMany('App\Post', 'taggable');
    }

    /**
     * Get all of the videos that are assigned this tag.
     */
    public function videos()
    {
        return $this->morphedByMany('App\Video', 'taggable');
    }
}

¿Cómo puedo obtener una lista de todos morphed relaciones en una consulta/colección, por ejemplo, posts y videosy luego si luego agregué photos (o cualquier cosa), eso también?

  • ¿Alguna vez encontró una solución?

    – John Mellor

    21 de noviembre de 2016 a las 16:18

  • Lo hice pero no tengo el código, estaba en un trabajo antiguo… lo que hice fue básicamente usar el generador de consultas para obtener los resultados y construir los modelos con los datos en una clase de colección personalizada.

    –Andrew Willis

    21 de noviembre de 2016 a las 21:12

avatar de usuario
iPaat

Yo uso un truco aquí:

Crear un modelo Taggable para tu mesa de conexiones taggable y agrega un hasMany relación con el Tag modelo.

public function related()
{
    return $this->hasMany(Taggable::class);
}

dentro de tu Taggable modelo crear un morphedTo relación.

public function taggables()
{
    return $this->morphTo();
}

Ahora puede obtener todos los modelos que usan la etiqueta llamando:

$tagged = Tag::with('related.taggables');

  • Creo que este es ahora el mejor enfoque para resolver este problema.

    –Andrew Willis

    13 de enero de 2020 a las 16:57

  • he hecho un esencia para toda la configuración + cómo obtener los elementos relacionados también

    – ctf0

    21 de julio de 2020 a las 17:09


¿Pensó en utilizar la función de “unión” de las colecciones para fusionar todas las diferentes colecciones con el fin de recuperar todo lo que necesita?

class Tag extends Model
{
    [...]

    /**
     * Get all of.
     */
    public function morphed()
    {
        return $this->video->union($this->posts)->all();
    }
}

  • Esto no funcionaría para la instancia en la que agregué más elementos transformados más adelante, aunque sí funcionaría para el caso específico de obtener videos y publicaciones.

    –Andrew Willis

    25 mayo 2017 a las 18:14

  • Cuando agregue un nuevo morphable, puede agregar una -> unión en esta función. Por supuesto, no es completamente automático, pero de todos modos debe cambiar algunas líneas de código en su modelo …

    – Simone Cabrino

    25 mayo 2017 a las 19:07

  • Esto no está funcionando. Por ejemplo: tengo un modelo de página y diferentes modelos están conectados a este, como contenido y paralaje. Tengo algunos registros conectados:

     página |  tipo |  identificación 1 |  contenido |  1 1 |  paralaje |  2 1 |  contenido |  3 1 |  contenido |  4 

    * Si lo hago $this->content->union($this->parallax)->all(); devuelve tres registros: 1, 3, 4 * Si lo hago $this->parallax->union($this->content)->all(); devuelve tres registros: 2, 3, 4

    – holgazanear

    1 de diciembre de 2019 a las 22:03


Debería poder agregar una relación en su clase de etiqueta como tal

public function taggable()
{
    return $this->morphedTo();
}

Eso usará taggable_id y taggable_type para obtener el modelo relevante al que está vinculado.

  • Eso es para relaciones polimórficas, estoy hablando específicamente de relaciones morphedByMany, que es una relación polimórfica de muchos a muchos. Actualizaré la pregunta para que quede más claro.

    –Andrew Willis

    11/03/2016 a las 21:41


¿Ha sido útil esta solución?