ORM para PHP: comparação entre Doctrine, Eloquent e Propel com exemplos

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course
Here is the translated HTML content in Portuguese (Português), with all HTML tags preserved and only the text content translated as requested. ```html

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
```

Recommendations