ORM para PHP: comparação entre Doctrine, Eloquent e Propel
Mapeamento Objeto-Relacional (ORM) é uma tecnologia que permite aos desenvolvedores trabalhar com bancos de dados usando uma abordagem orientada a objetos, em vez de escrever consultas SQL puras. Para PHP, existem várias soluções ORM maduras, cada uma com seus pontos fortes. Neste artigo, compararemos detalhadamente três dos ORMs mais populares: Doctrine, Eloquent (do Laravel) e Propel, além de fornecer exemplos práticos de código.
1. Doctrine: DataMapper poderoso
Doctrine é, sem dúvida, o ORM mais maduro e funcional para PHP. Ele implementa o padrão DataMapper, o que significa uma separação completa entre a lógica de negócios e a lógica de trabalho com o banco de dados. Principais características:
- Suporte a múltiplos SGBDs (MySQL, PostgreSQL, SQLite, Oracle, MSSQL)
- Sistema flexível de consultas via DQL (Doctrine Query Language)
- Suporte embutido a migrações, eventos, objetos proxy (carregamento preguiçoso)
- Alta performance quando o cache é configurado corretamente
Exemplo: definição de entidade e consulta
// Entidade 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 e 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 via EntityManager$userRepository = $entityManager->getRepository(User::class);$users = $userRepository->findBy(['name' => 'Иван'], ['id' => 'DESC'], 10);foreach ($users as $user) { echo $user->getName() . ' - ' . $user->getEmail() . PHP_EOL;}2. Eloquent: simplicidade e elegância
Eloquent é o ORM padrão do framework Laravel, implementando o padrão ActiveRecord. Cada modelo é simultaneamente uma entidade e um repositório. Principais vantagens:
- Código mínimo para operações padrão
- Interface fluente bonita para construção de consultas
- Relacionamentos embutidos (belongsTo, hasMany, morphMany, etc.)
- Documentação excelente e comunidade enorme
Exemplo: modelo e consultas
// Modelo User (arquivo app/Models/User.php)namespace App\\Models;
use Illuminate\\Database\\Eloquent\\Model;
class User extends Model{ protected $fillable = ['name', 'email']; // Definição do relacionamento "um para muitos" public function posts() { return $this->hasMany(Post::class); }}
// Uso no controller$users = User::where('name', 'LIKE', '%Иван%') ->orderBy('created_at', 'desc') ->limit(10) ->get();
foreach ($users as $user) { echo $user->name . ' - ' . $user->email . PHP_EOL; // Carregamento preguiçoso de registros relacionados foreach ($user->posts as $post) { echo ' Post: ' . $post->title . PHP_EOL; }}3. Propel: performance e geração de código
Propel é um ORM que gera classes com base no esquema do banco de dados (XML ou YAML). Ele usa o padrão ActiveRecord, mas com foco em performance e tipagem estrita. Principais características:
- Geração de classes de modelo (sem necessidade de escrever getters/setters manualmente)
- Embutido