43. Relación mucho a muchos polimorfica

En una relación muchos a muchos polimórfica, varias filas en una tabla pueden estar relacionadas con varias filas en varias tablas de otra entidad. Esto se logra mediante el uso de tres tablas en lugar de dos, una tabla de relación polimórfica, una tabla de identificadores y una tabla de tipos.

La tabla de relación polimórfica contiene claves foráneas que apuntan tanto a la tabla de identificadores como a la tabla de tipos, y se utiliza para almacenar las relaciones entre las diferentes entidades. La tabla de identificadores contiene los identificadores únicos de cada entidad, mientras que la tabla de tipos contiene los nombres de las diferentes tablas de destino. Un ejemplo común de una relación muchos a muchos polimórfica es un sistema de "Me gusta", donde los usuarios pueden dar "Me gusta" a varios tipos de contenido, como publicaciones, imágenes, videos, etc.


2 comentarios

Inicia sesión para comentar

Comentarios:

  • Walter

    Walter hace 1 año

    ? Relaciones muchos a muchos polimórficas

     

    En este caso encontramos a las tablas videos y posts relacionadas con la tabla tags.

    Para representar estas relaciones creamos una única tabla intermedia llamada taggables con los campos taggable_id y taggable_type.

     

    ? Creamos el modelo Tag y su migración

     

    php artisan make:model Tag -m

     

    En la migración agregamos el campo name:

     

    $table->string('name');

     

    ? Creamos la tabla intermedia Taggable

     

    php artisan make:migration create_taggables_table

     

    En el método up de la migración completamos con los campos:

     

    $table->unsignedBigInteger('taggable_id');
    $table->string('taggable_type');
    
    $table->unsignedBigInteger('tag_id');
    
    $table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade');

     

    Corremos las migraciones:

     

    php artisan migrate

     

    ? Realizamos las relaciones a nivel de modelos

     

    ? Relación con el modelo Post

     

    public function tags() {
    	return $this->morphToMany('App\Models\Tag', 'taggable');
    }

     

    ? Relación con el modelo Video

     

    public function tags() {
    	return $this->morphToMany('App\Models\Tag', 'taggable');
    }

     

    ? Relación muchos a muchos inversa polimórfica con el modelo Tag

     

    public function posts() {
    	return $this->morphedByMany('App\Models\Post', 'taggable');
    }
    
    public function videos() {
    	return $this->morphedByMany('App\Models\Video', 'taggable');
    }

     

  • Mis Soporte

    Mis Soporte hace 1 año

    Hola profe en este vídeo usa el método post tantanto el modelo post como en videos, esto es un error o por que usar post y no tags ?

    • Victor Arana Flores hace 1 año

      Hola amigo, no entendi tu pregunta

    • Mis Soporte hace 1 año

      en el minuto 7:19 para hacer la relación de post con tags en el metodo usa la palabra post y lo mismo en la relacion de videos con tags, no seria mejor usar tags ?

    • Alan Rodriguez hace 1 año

      Hola! Si, noté lo mismo. En el modelo Post y en el modelo Video los métodos entiendo que tienen que llamarse Tags() en lugar de Post(). 

    • Sergio S. S. ┏(-_-)┛┗(-_- )┓┗(-_-)┛ hace 2 meses

      Cuando en el video comentas de hacer la relacion MUCHOS a MUCHOS POLIMORFICA entre la tabla "posts" y la tabla "taggables" en el modelo Post.php, defines una funcion llamada posts lo cual, por lo que hemos estamos aprendiendo contigo es que no deberia llamarse “posts” si no “tags” el nombre de la funcion, quedando de la siguiente forma:

      public function tags(){
             return $this->morphToMany('App\Models\Tag', 'taggable');
      }

      Y esto mismo sucede en el modelo Video.php vuelves a comentar el definir con el nombre de la funcion “posts”  la relacion muchos a muchos polimorfica, cuando estamos haciendo referencia a la tabla “taggable”:

      public function posts(){//Aqui nombras a la funcion "posts" y deberia ser "tags"
             return $this->morphToMany('App\Models\Tag', 'taggable');
      }

      Es lo que comentan y al parecer creo que estarian en lo correcto. solo es este pequeña observación, un saludos Victor y excelente el curso de laravel, y por la buena dinamica de enseñanza que has logrado con tus videos.