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.


1 comentarios

Inicia sesión para comentar

Comentarios:

  • Walter

    Walter hace 2 años

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