TORM, um ORM simples para PHP
Publicado em Developer
orm php torm
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
- Pull requests em modo raiz - sex, 22 de dezembro de 2023, 09:57:09 -0300
- Qual a idade do seu repositório? - ter, 27 de dezembro de 2022, 12:50:35 -0300
- Utilizando ctags em projetos Rails mais recentes - qui, 24 de junho de 2021, 08:23:43 -0300
- Fazendo o seu projeto brotar - seg, 15 de julho de 2019, 08:57:05 -0300
- Learn Functional Programming with Elixir - sex, 02 de março de 2018, 18:47:13 -0300
- Ambiente mínimo - Driver Driven Development - qua, 23 de agosto de 2017, 15:15:03 -0300
- Ambiente mínimo - repositórios de código - dom, 16 de abril de 2017, 13:02:14 -0300
- Ambiente mínimo - terminal e navegador - dom, 02 de abril de 2017, 21:43:29 -0300
- Utilizando muitas gems no seu projeto? - sáb, 29 de outubro de 2016, 11:57:55 -0200
- Desenvolvedores e inteligência artificial - seg, 11 de julho de 2016, 09:09:38 -0300