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();
}
public function comments()
{
return $this->morphMany(Comment::class, 'commentable');
}
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'
]);
//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();$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.).