Polimorfismo laravel

Cuando se va a utilizar un modelo o tabla que contendrá varios tipos de otros modelos o tablas, se utilizan las relaciones polimorficas.

Es fácil verlo con un ejemplo.

Una base de datos se guardan imágenes para productos, categorías, posts o artículos. ¿cómo asignar o agregar las imágenes?

  1. Opción menos aconsejable de guardar en cada modelo o tabla su url de imagen.
  2. Opción recomendada de guardar todas las imágenes en un modelo o tabla única, guardando su url y también indicando el tipo de imagen que se trata, productos, categorías, post o artículos.
Índice
  1. Crear tablas polimórficas con migraciones
  2. Crear modelo polimórfico
  3. Relaciones polimórficas entre modelos
  4. Resumen de código

Crear tablas polimórficas con migraciones

Para aplicar esto a la creación de la tabla, en la migración se puede poner el siguiente código:

  • url: guardar la dirección url donde está guardada la imagen
    Ej: public/images/imagen1.jpg
  • imageable_id: guardar el id del registro al que corresponda la imagen. El campo se llama como el modelo en singular concatenado con la palabra able, mas guión bajo _id
    Ej: 1
  • imageable_type: guardar el tipo de registro que pertenece la imágen. El cambpo se llama como el modelo en singular concatenado con la palabra able, mas guión bajo _type
    Ej: App\Models\Post

Schema::create('images', function (Blueprint $table) {
$table->id();
$table->string('url');
$table->unsignedBigInteger('imageable_id');
$table->text('imageable_type');
$table->timestamps();
});

De esta forma se identifica una tabla o modelo en relación polimórfica.

Crear modelo polimórfico

Para indicar que un modelo es polimórfico, hay que indicarlo creando una función con el método morphTo().

La función se llamará igual que se ha llamado el modelo en singular y terminado en able. En el ejemplo de Image sería imageable

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

Relaciones polimórficas entre modelos

Igual que cualquier hay que definir relaciones entre modelos comunes, también hay que definir las relaciones de los casos con polimorfismo.

Relación polimórfica uno a uno

También llamada relación polimórfica 1:1, donde donde un registro de una tabla solo tiene un registro en la otra tabla polimórfica.

Siguiendo el ejemplo de imágenes, una categoria solo tiene una imagen

  • Modelo1: (Relacion 1:1 polimórfica) se inserta el código con la función morphOne referente al otro modelo2.
    Definir nombre de la función en singular, ya que solo hay uno.
    Se pasan dos parámetros:
    1- El tipo del modelo.
    2- El nombre del método o función que identifica el modelo polimórfica.

class Categoy extends Model{
...
public function image(){

return $this->morphOne('App\Models\Image', 'imageable');
}

Relación polimórfica uno a muchos

También llamada relación polimórfica 1:n, donde donde un registro de una tabla tiene muchos registros en la otra tabla polimórfica.

  • Modelo1: (Relacion 1:n polimórfica) se inserta el código con la función morphMany referente al otro modelo2.
    Definir nombre de la función en plurar, ya que son muchos.
    Se pasan dos parámetros:
    1- El tipo del modelo.
    2- El nombre del método o función que identifica el modelo polimórfica.

class Category extends Model{
...
public function images(){
return $this->morphMany('App\Models\Image', 'imageable');
}

Relación polimórfica al propio modelo

Igual que la relación polimórfica 1:n, uno modelo polimorfico puede tener contenido de si mismo.

Por ejemplo: En un comentario de un usario, puede haber respuestas a ese comentario. Así se usa el mismo modelo con sigo mismo.

  • Modelo1: (Relacion 1:n polimórfica) se inserta el código con la función morphMany referente si mismo modelo1.
    Definir nombre de la función en plurar, ya que son muchos.
    Se pasan dos parámetros:
    1- El tipo del modelo.
    2- El nombre del método o función que identifica el modelo polimórfica.

class Comment extends Model{
...
public function comments(){
return $this->morphMany('App\Models\Comment', 'commentable');
}

Resumen de código

  • morphTo() - declarar polimorfismo al modelo
  • morphOne('App\Models\Modelo', '...able') - uno a uno (1:n)
  • morphMany('App\Models\Modelo', '...able'); - relación uno a muchos (1:n)

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir