Eustáquio Rangel

Desenvolvedor, pai, metalhead, ciclista

TORM, um ORM simples para PHP

Publicado em Developer


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 a parada, com a condição de que eu teria pelo menos um ORM em PHP para trabalhar, a qual 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

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. :-)




Comentários

Comentários fechados.

Sem nenhum comentário.

Artigos anteriores