09-10-2026

Relaciones polimórficas en laravel eloquent

Las relaciones polimórficas en Laravel permiten que un modelo se asocie con más de un tipo de modelo mediante una única asociación. El caso más habitual es el de los comentarios: un comentario puede pertenecer indistintamente a un Post, a un Video o a cualquier otro modelo.
En lugar de crear tablas de comentarios separadas para cada entidad, se utiliza una sola tabla que almacena el identificador y el tipo del modelo al que pertenece cada registro.

Definición en los modelos

Modelo que puede pertenecer a varios tipos:

public function commentable()
{
    return $this->morphTo();
}
Modelos que poseen la relación:


public function comments()
{
    return $this->morphMany(Comment::class, 'commentable');
}
Si la relación es de uno a uno en lugar de uno a muchos, se utiliza "morphOne" en lugar de "morphMany".
El segundo parámetro de "morphMany" debe coincidir con el nombre del método definido en el modelo que implementa "morphTo".

Ejemplo de uso

//Creación de un comentario asociado a un post
$post = Post::find(1);

$post->comments()->create([
    'content' => 'Contenido del comentario'
]);
Eloquent asigna automáticamente los valores de "commentable_id" y "commentable_type".
//Recuperación de los registros
// Comentarios de un post
$comments = $post->comments;

// Obtención del modelo padre desde el comentario
$comment = Comment::find(5);
$parent = $comment->commentable; // Instancia de Post, Video u otro modelo

Carga eager de relaciones

Para evitar el problema N+1 se recomienda el uso de "with":

$posts = Post::with('comments')->get();
También es posible cargar la relación inversa:

$comments = Comment::with('commentable')->get();

Consideraciones técnicas

  • Es posible definir un mapa de tipos polimórficos mediante "Relation::enforceMorphMap()" en el "AppServiceProvider" para utilizar alias en lugar del nombre completo de la clase.
  • Las relaciones polimórficas son compatibles con "withCount", "whereHas", "whereDoesntHave" y el resto de métodos de consulta de Eloquent.
  • En relaciones muchos a muchos polimórficas se emplean "morphToMany" y "morphedByMany".
  • Se recomienda revisar la documentación oficial cuando se requieran configuraciones avanzadas, como custom morph types, soft deletes, etc.).