Algum tempo atrás peguei um projeto em um cliente novo que não quis fazer o projeto utilizando Rails
, por motivos que concernem apenas à ele, mas como argumentação básica que o time de desenvolvedores já utiliza PHP “puro” e a curva de aprendizado do Rails para a equipe toda seria algo que eles não gostariam de lidar.
Atualmente, nem estou trabalhando com projetos web fora do eixo Ruby/Rails/Sinatra, porém era um projeto interessante e resolvi topar, com a condição de que eu teria pelo menos um ORM em PHP para trabalhar. E eles concordaram.
Após avaliar alguns ORMs em PHP por aí, não gostei muito de nenhum, com exceção do Eloquent, que para ser utilizado fora do Laravel exigia um pouco mais de ginástica e outro pacote. Então, decidi fazer o meu próprio, o TORM, que no final das contas ficou (e está ficando) bem interessante, tentando descaradamente copiar várias features do ActiveRecord.
Conectando no banco
A configuração dele é simples: a parte da conexão com o banco é feita através do PDO, e tudo o que é necessário para o funcionamento está no arquivo torm.php
. Vamos utilizar de exemplo o SQLite (mas já tem suporte para o MySQL e o Oracle):
include "torm.php"; $con = new PDO("sqlite:database.sqlite3"); TORM\Connection::setConnection($con); TORM\Connection::setDriver("sqlite");
Modelos
Para definir os modelos é fácil: é só seguir a convenção (copiada do ActiveRecord
) do nome da classe no singular ser o nome da tabela no plural (inclusive tem até suporte para pluralizações):
class User extends TORM\Model {}; class Ticket extends TORM\Model {};
Validações
Podemos especificar algumas validações facilmente:
User::validates("name", array("presence"=>true)); User::validates("email", array("presence"=>true)); User::validates("email", array("uniqueness"=>true)); User::validates("id", array("numericality"=>true));
Relacionamentos
Os relacionamentos podem ser definidos como:
User::hasMany("tickets"); User::hasOne("account"); Ticket::belongsTo("user");
Manipulando registros
Para criar um registro novo de User
:
$user = new User(); $user->name = "John Doe"; $user->email = "john@doe.com"; $user->level = 1 $user->save()
Para procurar através do id (que por convenção é a chave primária):
$user = User::find(1);
Para procurar todos em determinadas condições:
$users = User::where(array("level"=>1));
Atualizar vários registros de uma vez:
User::where(array("level"=>1))->updateAttributes(array("level"=>3));
Utilizar queries fluentes:
$users = User::where(array("level"=>1)).limit(5).order("name desc");
Utilizar os relacionamentos:
foreach($user->tickets as $ticket) echo $ticket->description; echo $user->account->number;
Fora isso, ainda tem suporte à escopos, callbacks, factories, paginação, etc. E ainda falta muita coisa que eu quero colocar por lá. Vejam a seção de instalação se resolverem testar o danado.
Se você se encontra em um projeto como esse do meu cliente, onde não pode usar Rails e tem que usar PHP, pode ser que esse projeto seja de alguma valia e ajuda.