ORM para PHP: comparación de Doctrine, Eloquent y Propel
El mapeo objeto-relacional (ORM) es una tecnología que permite a los desarrolladores trabajar con bases de datos utilizando un enfoque orientado a objetos en lugar de escribir consultas SQL puras. Para PHP existen varias soluciones ORM maduras, cada una con sus propias fortalezas. En este artículo compararemos en detalle tres de los ORM más populares: Doctrine, Eloquent (de Laravel) y Propel, además de proporcionar ejemplos prácticos de código.
1. Doctrine: potente DataMapper
Doctrine es, probablemente, el ORM más maduro y funcional para PHP. Implementa el patrón DataMapper, lo que significa una separación completa entre la lógica de negocio y la lógica de trabajo con la BD. Características principales:
- Soporte para múltiples SGBD (MySQL, PostgreSQL, SQLite, Oracle, MSSQL)
- Sistema flexible de consultas mediante DQL (Doctrine Query Language)
- Soporte integrado para migraciones, eventos, objetos proxy (carga diferida)
- Alto rendimiento con una configuración adecuada de caché
Ejemplo: definición de entidad y consulta
// Entidad Useruse Doctrine\\ORM\\Mapping as ORM;
#[ORM\\Entity]#[ORM\\Table(name: "users")]class User{ #[ORM\\Id] #[ORM\\GeneratedValue] #[ORM\\Column(type: "integer")] private int $id;
#[ORM\\Column(type: "string", length: 100)] private string $name;
#[ORM\\Column(type: "string", length: 255, unique: true)] private string $email;
// Getters y setters public function getId(): int { return $this->id; } public function getName(): string { return $this->name; } public function setName(string $name): void { $this->name = $name; } public function getEmail(): string { return $this->email; } public function setEmail(string $email): void { $this->email = $email; }}
// Consulta mediante EntityManager$userRepository = $entityManager->getRepository(User::class);$users = $userRepository->findBy(['name' => 'Iván'], ['id' => 'DESC'], 10);foreach ($users as $user) { echo $user->getName() . ' - ' . $user->getEmail() . PHP_EOL;}2. Eloquent: simplicidad y elegancia
Eloquent es el ORM estándar del framework Laravel, que implementa el patrón ActiveRecord. Cada modelo es a la vez una entidad y un repositorio. Principales ventajas:
- Código mínimo para operaciones estándar
- Hermosa interfaz fluida para la construcción de consultas
- Relaciones integradas (belongsTo, hasMany, morphMany, etc.)
- Excelente documentación y una comunidad enorme
Ejemplo: modelo y consultas
// Modelo User (archivo app/Models/User.php)namespace App\\Models;
use Illuminate\\Database\\Eloquent\\Model;
class User extends Model{ protected $fillable = ['name', 'email']; // Definición de relación "uno a muchos" public function posts() { return $this->hasMany(Post::class); }}
// Uso en el controlador$users = User::where('name', 'LIKE', '%Iván%') ->orderBy('created_at', 'desc') ->limit(10) ->get();
foreach ($users as $user) { echo $user->name . ' - ' . $user->email . PHP_EOL; // Carga diferida de registros relacionados foreach ($user->posts as $post) { echo ' Post: ' . $post->title . PHP_EOL; }}3. Propel: rendimiento y generación de código
Propel es un ORM que genera clases basándose en el esquema de la base de datos (XML o YAML). Utiliza el patrón ActiveRecord, pero con énfasis en el rendimiento y el tipado estricto. Características clave:
- Generación de clases de modelo (no es necesario escribir getters/setters manualmente)
- Incorpora
También en la biblioteca
Event Bus y el patrón Observer en Kotlin: guía con ejemplos
Envío de correo electrónico en Swift: bibliotecas y ejemplos para iOS/macOS
Frameworks CLI para Kotlin: creación de aplicaciones de consola