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