ORM para PHP: comparação e exemplos
ORM (Object-Relational Mapping) é uma camada entre o código PHP e o banco de dados relacional. Ela transforma linhas de tabelas em objetos e consultas SQL em métodos. Para PHP, existem várias soluções ORM maduras. Neste artigo, analisaremos as três mais populares: Doctrine, Eloquent (do Laravel) e Cycle. Você conhecerá suas filosofias, sintaxes e obterá exemplos de código prontos.
1. Doctrine ORM — Data Mapper
Doctrine é a ORM mais poderosa e madura para PHP. Utiliza o padrão Data Mapper: as entidades (Entity) não conhecem o banco de dados, e todo o trabalho com o BD é realizado através de repositórios e do gerenciador de entidades EntityManager.
// Exemplo de entidade no Doctrineuse 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;
public function getName(): string { return $this->name; }
public function setName(string $name): void { $this->name = $name; }}
// Salvando e recuperando$user = new User();$user->setName('Alexey');$entityManager->persist($user);$entityManager->flush();
$users = $entityManager->getRepository(User::class)->findAll();2. Eloquent ORM — Active Record
Eloquent é a ORM do framework Laravel. Utiliza o padrão Active Record: cada objeto sabe como se salvar no BD. O código é compacto e intuitivo, ideal para desenvolvimento rápido.
// Modelo Eloquentuse Illuminate\\Database\\Eloquent\\Model;
class User extends Model{ protected $table = 'users'; protected $fillable = ['name'];}
// Criando um registro$user = User::create(['name' => 'Maria']);
// Leitura$users = User::where('name', 'like', '%Ma%')->get();
foreach ($users as $user) { echo $user->name;}
// Atualização$user = User::find(1);$user->name = 'Olga';$user->save();3. Cycle ORM — abordagem híbrida
Cycle é uma ORM moderna dos criadores do framework Spiral. Combina as melhores características do Data Mapper e do Active Record. Funciona mais rápido que o Doctrine devido ao cache de esquema e à ausência de magia. Suporta tipagem estrita.
// Entidade Cycleuse Cycle\\Annotated\\Annotation as Cycle;
/** * @Cycle\\Entity * @Cycle\\Table(name="users") */class User{ /** @Cycle\\Column(type="primary") */ public int $id;
/** @Cycle\\Column(type="string") */ public string $name;}
// Salvando$user = new User();$user->name = 'Ivan';$orm->persist($user);$orm->run();
// Busca$users = $orm->getRepository(User::class)->select()->fetchAll();Comparação de ORMs para PHP
| Característica | Doctrine | Eloquent | Cycle |
|---|---|---|---|
| Padrão | Data Mapper | Active Record | Híbrido |
| Desempenho | Médio | Alto (com cache) | Alto |
| Vínculo com framework | Independente | Laravel | Spiral / independente |
| Geração de migrações | Integrada | Via Artisan |
Também na bibliotecaRecommendations |