ORM no PHP5 utilizando o SQLReactor
Com estes passos concluídos, podemos criar as tabelas. Crie um arquivo "create_tables.php";
create_tables.php
Acesse o arquivo e as tabelas devem ser criadas. Se nenhum erro ocorrer, a página não deve exibir outputs.
Caso contrário verifique os dados de acesso ao banco, se seu PHP está corretamente configurado com a extensão do tipo de banco de dados escolhido, ou se existe algum erro de digitação.
Depois das tabelas criadas, podemos começar a acessar os objetos.
O SQLReactor define setters e getters automaticamente pra todas as classes, porém usá-los é indiferente, pois ele força que atributos acessados diretamente, passem automaticamente por setters e getters internos e pelos setters e getters mágicos.
Inserindo dados de exemplo:
sample_inserts.php
Buscando instância por id:
Acessando atributo por lazy load:
Buscando objeto usando filtro:
Listando Objetos, usando o filtro pelo id do grupo:
Trazendo relações com eager load:
Contando registros no banco:
Exemplo completo de listagem:
Alterando objetos:
Removendo objetos:
create_tables.php
<?php
include "open_connection.php";
include "mapping.php";
SQLReactor::createTable( 'User' );
SQLReactor::createTable( 'Group' );
SQLReactor::createTable( 'UserGroup' );
include "close_connection.php";
?>
Acesse o arquivo e as tabelas devem ser criadas. Se nenhum erro ocorrer, a página não deve exibir outputs.
Caso contrário verifique os dados de acesso ao banco, se seu PHP está corretamente configurado com a extensão do tipo de banco de dados escolhido, ou se existe algum erro de digitação.
Depois das tabelas criadas, podemos começar a acessar os objetos.
O SQLReactor define setters e getters automaticamente pra todas as classes, porém usá-los é indiferente, pois ele força que atributos acessados diretamente, passem automaticamente por setters e getters internos e pelos setters e getters mágicos.
Inserindo dados de exemplo:
sample_inserts.php
$user = new User();
$user->setLogin( 'user1' );
$user->setPassword( '123456' );
$user->setBirthday( mktime( 0, 0, 0, 29, 3, 1986 ) );
$user->save();
echo $user->id; //armazena o id do objeto inserido
$user = new User();
$user->login = 'user2';
$user->password = '123456';
$user->birthday = mktime( 0, 0, 0, 29, 3, 1989 );
$user->save();
$group = new User();
$group->name = 'Group 1';
$group->save();
$group = new User();
$group->name = 'Group 2';
$group->save();
$ug = new UserGroup();
$ug->userId = 1;
$ug->groupId = 1;
$ug->save();
$ug = new UserGroup();
$ug->userId = 1;
$ug->groupId = 2;
$ug->save();
$ug = new UserGroup();
$ug->userId = 2;
$ug->groupId = 2;
$ug->save();
Buscando instância por id:
$user = new User( 1 );
Acessando atributo por lazy load:
$user->groups;
Buscando objeto usando filtro:
$user = SQLReactor::get( 'User', array(
'filter' => array(
array( 'login', 'user1' ),
array( 'isActive', true ),
)
) );
Listando Objetos, usando o filtro pelo id do grupo:
$list = SQLReactor::getList( 'User', array(
'filter' => array(
array( 'isActive', true ),
array( 'birthday', '>=', mktime( 0, 0, 0, 1, 1, 1986 ) ),
array( 'groups->group->id', 2 )
)
) );
Trazendo relações com eager load:
$list = SQLReactor::getList( 'User', array(
'filter' => array(
array( 'isActive', true ),
array( 'groups->group->id', 2 )
),
'eagerload' => array( 'groups->group' )
) );
Contando registros no banco:
$count = SQLReactor::count( 'User', array(
'filter' => array(
array( 'isActive', true ),
array( 'groups->group->id', 2 )
),
'eagerload' => array( 'groups->group' )
) );
Exemplo completo de listagem:
$list = SQLReactor::getList( 'User', array(
'filter' => array(
array( 'isActive', true ),
array( 'groups->group->id', 2 )
),
'eagerload' => array( 'groups->group' ),
'limit' => array( 'groups->group' ),
'offset' => array( 'groups->group' ),
'orderBy' => 'birthday',
'direction' => 'asc'
) );
Alterando objetos:
$user = new User( 1 );
$user->isActive = false;
$user->save();
Removendo objetos:
$user = new User( 1 );
$user->delete();
Pra quem interessar, também existe um grupo para discussão de dúvidas sobre o projeto.
http://groups.google.com.br/group/sqlreactor-brasil
Abraços
http://groups.google.com.br/group/sqlreactor-brasil
Abraços
29/05/2009 2:57pm
(~16 anos atrás)
Marcos,
Você está completamente correto ao dizer da quantidade de recusos. Como eu mesmo disse no artigo, é um projeto bem novo (versao 0.3) e precisa mesmo de muitas coisas ainda. Conheci o Doctrine recentemente e concordo com você que ele vale muito a pena.
Porém, discordo quanto ao propel. O mapeamento de objetos não é tão simples e, mesmo o SQLReactor sendo novo, ja faz, de forma simples, coisas chatas de se fazer no propel, por exemplo. (Como fazer eagerload de múltiplos níveis)
Se você conhecer python, vai notar que a forma de mapeamento do SQLReactor se basea na forma do SQLObject, que é muito simples... Já a forma de busca e acesso aos dados, assemelha-se ao SQLAlchemy, que é considerado um dos mais completos pra python.
O reactor nasceu pra ser diferente dos outros ORMs em PHP. Eu o considero mais prático. Mas cada um prefere o seu. O objetivo do artigo é divulgar mais uma ferramenta de ORM e mostrar como funciona.
Fica por conta de cada desenvolvedor a escolha do seu.
Abraços,
Rafael
Você está completamente correto ao dizer da quantidade de recusos. Como eu mesmo disse no artigo, é um projeto bem novo (versao 0.3) e precisa mesmo de muitas coisas ainda. Conheci o Doctrine recentemente e concordo com você que ele vale muito a pena.
Porém, discordo quanto ao propel. O mapeamento de objetos não é tão simples e, mesmo o SQLReactor sendo novo, ja faz, de forma simples, coisas chatas de se fazer no propel, por exemplo. (Como fazer eagerload de múltiplos níveis)
Se você conhecer python, vai notar que a forma de mapeamento do SQLReactor se basea na forma do SQLObject, que é muito simples... Já a forma de busca e acesso aos dados, assemelha-se ao SQLAlchemy, que é considerado um dos mais completos pra python.
O reactor nasceu pra ser diferente dos outros ORMs em PHP. Eu o considero mais prático. Mas cada um prefere o seu. O objetivo do artigo é divulgar mais uma ferramenta de ORM e mostrar como funciona.
Fica por conta de cada desenvolvedor a escolha do seu.
Abraços,
Rafael
23/05/2009 5:39pm
(~16 anos atrás)
O artigo é realmente válido. Usar ORM tende a se tornar padrão em qualquer priojeto e em qualquer linguagem.
Quanto ao SQLReactor só o que tenho a dizer é que ele está muito longe das funcionalidades de outros ORMs mais maduros como o Propel <http://propel.phpdb.org/trac/> e o Doctrine <http://www.doctrine-project.org/>. Esses sim valem muito a pena.
Eu mesmo construi um ORM que ainda uso em alguns projetos mais antigos. Dieferente desses mencionados que utilizam o Pattern Active Record <http://pt.wikipedia.org/wiki/Active_record> eu usei o Pattern DAO <http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html>.
Outro ponto é a classe de abstração. Eu já utilizava PDO no meu ORM desde o início (quando foi lançado junto com a versão 5 do PHP) e agora todos tendem a migrar para ele assim como fez o Propel que utilizava Creole.
Alias o modelo de ORM que acho interessante e que inclusive "copie" diversas idéias é o JPA do Java.
Quanto ao SQLReactor só o que tenho a dizer é que ele está muito longe das funcionalidades de outros ORMs mais maduros como o Propel <http://propel.phpdb.org/trac/> e o Doctrine <http://www.doctrine-project.org/>. Esses sim valem muito a pena.
Eu mesmo construi um ORM que ainda uso em alguns projetos mais antigos. Dieferente desses mencionados que utilizam o Pattern Active Record <http://pt.wikipedia.org/wiki/Active_record> eu usei o Pattern DAO <http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html>.
Outro ponto é a classe de abstração. Eu já utilizava PDO no meu ORM desde o início (quando foi lançado junto com a versão 5 do PHP) e agora todos tendem a migrar para ele assim como fez o Propel que utilizava Creole.
Alias o modelo de ORM que acho interessante e que inclusive "copie" diversas idéias é o JPA do Java.
23/05/2009 4:33pm
(~16 anos atrás)
Fala ae Rapaz....
Parabens pelo artigo, ficou muito bom....
abraço
fui
Parabens pelo artigo, ficou muito bom....
abraço
fui
22/05/2009 12:45pm
(~16 anos atrás)
O SQLReactor é genial. Amei o artigo :D