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

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

ORM para PHP: visão geral e comparação de bibliotecas populares



ORM (Object-Relational Mapping) é uma tecnologia que permite trabalhar com bancos de dados através de objetos da linguagem de programação, em vez de consultas SQL. No PHP, existem várias bibliotecas ORM poderosas, cada uma com suas próprias características, vantagens e desvantagens. Neste artigo, compararemos detalhadamente quatro soluções mais populares: Doctrine, Eloquent, Propel e RedBeanPHP. Você aprenderá como elas funcionam, verá exemplos de código e poderá fazer uma escolha consciente para o seu projeto.



1. Doctrine — controle total e DQL poderoso



Doctrine é o ORM mais maduro e funcionalmente rico para PHP. Ele consiste em dois componentes: DBAL (Database Abstraction Layer) e ORM (Object-Relational Mapping). O Doctrine usa o padrão Data Mapper, o que significa uma separação completa entre a lógica de negócios e a lógica de armazenamento de dados.



Principais características:

  • Suporte completo ao Doctrine Query Language (DQL) — SQL orientado a objetos
  • Sistema flexível de migrações (Doctrine Migrations)
  • Carregamento preguiçoso e ativo de relacionamentos (Lazy/Eager Loading)
  • Suporte ao ciclo de vida de entidades baseado em eventos
  • Cache integrado (de metadados, consultas, resultados)


Exemplo de código:

<?php// Definição da entidade (Entity)use Doctrine\\ORM\\Mapping as ORM;

/** * @ORM\\Entity * @ORM\\Table(name="users") */class User{ /** @ORM\\Id @ORM\\Column(type="integer") @ORM\\GeneratedValue */ private int $id;

/** @ORM\\Column(type="string", length=100) */ private string $name;

/** @ORM\\Column(type="string", unique=true) */ private string $email;

// Getters e setters 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; }}

// Uso$entityManager = EntityManager::create($connectionParams, $config);$user = new User();$user->setName('Ivan Petrov');$user->setEmail('ivan@example.com');$entityManager->persist($user);$entityManager->flush();

// Consulta via DQL$query = $entityManager->createQuery('SELECT u FROM App\\Entity\\User u WHERE u.email = :email');$query->setParameter('email', 'ivan@example.com');$result = $query->getOneOrNullResult();


2. Eloquent — simplicidade e elegância (Laravel)



Eloquent é o ORM que faz parte do framework Laravel, mas também está disponível para uso separado através do pacote illuminate/database. Ele usa o padrão Active Record, onde cada modelo representa uma linha na tabela do BD. Eloquent é famoso por sua sintaxe intuitiva e gerenciamento automático de relacionamentos.



Principais características:

  • Configuração mínima — convenções em vez de configuração
  • Relacionamentos poderosos: belongsTo, hasMany, belongsToMany e outros
  • Gerenciamento automático de timestamps (created_at, updated_at)
  • Scopes, mutators e accessors integrados
  • Suporte a coleções e paginação


Exemplo de código:

<?phpuse Illuminate\\Database\\Eloquent\\Model;

class User extends Model{ protected $table = 'users'; protected $fillable = ['name', 'email']; protected $hidden = ['password'];

// Relacionamento "um para muitos" public function posts() { return $this->hasMany(Post::class); }}

// Criando registro$user = User::create([ 'name' => 'Anna Smirnova', 'email' => 'anna@example.com',]);

// Consulta com condições$activeUsers = User::where('status', 'active')

Recommendations