42. Relación uno a muchos polimorfica

En una relación uno a muchos polimórfica en una base de datos, una fila en una tabla se relaciona con varias filas en una tabla de otra entidad, pero en lugar de especificar una tabla de destino específica, la relación puede apuntar a varias tablas diferentes. Esto se logra mediante el uso de claves foráneas que apuntan a una tabla de identificadores y una tabla de tipos.

Un ejemplo común de una relación uno a muchos polimórfica es un sistema de etiquetas, donde una etiqueta puede estar relacionada con varios tipos de entidades como publicaciones, imágenes, videos, etc. En este caso, se crea una tabla de etiquetas que contiene una clave foránea a una tabla de identificadores y una tabla de tipos que puede ser una tabla de publicaciones, una tabla de imágenes, una tabla de videos, etc. De esta manera, se puede establecer una relación uno a muchos polimórfica entre las tablas de etiquetas, publicaciones, imágenes, videos, etc. La relación uno a muchos polimórfica es útil para simplificar la estructura de la base de datos y evitar la duplicación de tablas en casos donde las relaciones son similares pero no idénticas.


2 comentarios

Inicia sesión para comentar

Comentarios:

  • Carlos Sánchez

    Carlos Sánchez hace 2 años

    Tengo una duda…por qué cuando creamos el campo 'commentable_type' en la tabla comments, lo creamos de tipo string y no de tipo unsignedBigInteger? no se supone que cuando creas campos que relacionan a una tabla con otra, se declaran de esa manera? 

    • Victor Arana Flores hace 2 años

      En commentable type se coloca el nombre del modelo a relacionar, por eso se asigna de tipo string

    • Juan Rodriguez hace 2 años

      Fijate que en las tablas polimorficas no existe una restricción (foreign key) con otra tabla, puesto que no apunta a una, si no a varias tablas; por esto, es que internamente en la entidad se crean dos atributos, uno para el id y otro para la tabla a la que hace referencia (en este caso, el modelo), como la ruta del modelo es un string que indica donde se ubica, por esto se define como string.

  • Walter

    Walter hace 2 años

    ? Relaciones uno a muchos polimórficas

             En este caso podemos relacionar las tablas videos y posts con la tabla comments.

     

    ? Creamos la tabla comments

          

        php artisan make:model Comment -m

     

    ? Configuramos los campos en el archivo de migración

     

        $table->string('mensaje');
        $table->unsignedBigInteger('commentable_id');
        $table->string('commentable_type');
        
        $table->unsignedBigInteger('user_id');
        $table->foreign('user_id')->references('id')->on('users')
        	->onDelete('cascade');

     

            Corremos la migración:

     

        php artisan migrate

     

    ? Creamos las relaciones a nivel de modelos

            Indicamos que la tabla comments es de tipo polimórfica, en su modelo Comment:

     

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

     

            Ahora en los modelos Post y Video agregamos: 

     

        public function users() {
        	return $this->belongsTo('App\Models\Comment', 'commentable');
        }

     

    ? Creamos la relación uno a muchos entre users y comments

            En el modelo User agregamos:

     

        public function comments() {
        	return $this->hasMany('App\Models\Comment');
        }

     

            Y en el modelo Comment agregamos la relación uno a muchos inversa:

     

        public function comments() {
        	return $this->hasMany('App\Models\User');
        }