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?
- Opción menos aconsejable de guardar en cada modelo o tabla su url de imagen.
- 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.
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
referente al otro modelo2.morphMany
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
referente si mismo modelo1.morphMany
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