PHP Patterns parte 7: ActiveRecord

Posted on novembro 22, 2010. Filed under: PHP |

O design pattern ActiveRecord é uma abordagem para acessar dados em um banco de dados. Normalmente uma tabela do banco de dados é mapeado em um objeto. Um único objeto representa um registro dessa tabela. O objeto instanciado disponibiliza métodos de acesso e propriedades para insert/update/delete/select e mapea cada coluna da tabela que esta sendo trabalhada.

Abaixo são alguns projetos PHP que implementam o pattern ActiveRecord:

Doctrine
Php Active Record
Propel
Adodb

Abaixo vamos exemplificar a utilização do pattern ActiveRecord baseado na biblioteca do Adodb.

Inserindo dados na tabela:
class usuario extends ADOdb_Active_Record{}
$usuario = new usuario();
$usuario->nome = 'João';
$usuario->sobrenome = 'Silva';
$usuario->save();

O código acima irá gerar:
INSERT INTO usuario (nome, sobrenome) VALUES('João', 'Silva');

Após o INSERT, o campo “id” do objeto é populado com o id gerado pelo INSERT. Utilizar a função save() após o insert, os dados do registros serão atualizados com UPDATE. Outras formas de update são setar um valor para o campo “id” do objeto usuario ou realizar um save após ter feito um load da tabela. Exemplo:

// efetuar um insert
$usuario->sobrenome = 'Silva de Almeida';
$usuario->save();

// fazer um load e depois save gera um update
$usuario->load("id=1");
$usuario->sobrenome = 'Silva de Almeida';
$usuario->save();

O código gerado será:
UPDATE usuario SET sobrenome='Silva de Almeida' WHERE id=1;

Para carregar um registro da tabela do banco de dados em um objeto ActiveRecord:
$usuario->load("id=10");
echo $usuario->nome;

O SQL gerado será:
SELECT * FROM usuario WHERE id=10

Quando quiser retornar várias linhas de uma tabela utilize o método Find. Ele irá retornar um array de objetos do tipo Usuario:
$usuario = new usuario();
$usuarioArray = $usuario->Find("nome like ?", array('Am%'));

O SQL gerado será:
SELECT * FROM usuario WHERE nome like 'Am%'

Relacionamento Um para Muitos: No relacionamento um para muitos temos que especificar as tabelas que irão se relacionar. Vamos usar as tabelas “usuario” e “permissao”. O join vai ser realizado entre os campos usuario.id e permissao.usuario_id. Primeiro vamos carregar um registro da tabela de usuário e seus respectivos registros da tabela de permissao. A tabela de permissao guarda informção sobre os privilégios que o usuário tem no sistema. Um usuário pode ter diversos privilégios. Por exemplo, permissão para gerar relatório, permissão para acessar área administrativa, etc.. Após obter os privilégios do usuário, vamos modificar a descrição de cada registro de permissão individualmente:

class usuario extends ADOdb_Active_Record{}
ADODB_Active_Record::ClassHasMany('usuario', 'permissao','usuario_id');
$usuario = new usuario();
$usuario->Load("id=1");
foreach($usuario->permissao as $p) {
  echo $p->descr_permissao;
  $p->descr_permissao .= " (Modificado)'';
  $p->save(); // registros de permissao deverão ser salvos individualmente
}

Existem outras sintaxes de implementação do pattern ActiveRecord, porém a idéia será sempre a mesma. Você pode checar nos links que citei acima para maiores detalhes.

Make a Comment

Deixe uma resposta para pasquati Cancelar resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

2 Respostas to “PHP Patterns parte 7: ActiveRecord”

RSS Feed for Pasqua Tecnologia Comments RSS Feed

Realmente muito bom tutorial mas existe um problema. O método find não retorna resultado algum.

A mesma sintaxe com o método Load retorna apenas uma linha. Será um Bug desta biblioteca?

Olá Luiz, Legal sua questão.

Realmente faz muito tempo que não uso ADOdb. Após esse seu post, realizei alguns testes com ele novamente e obtive alguns resultados indesejados também.

Recomento analisar outras opções, como o Propel http://propelorm.org/ ou Doctrine http://www.doctrine-project.org/ que também implementam o Pattern ActiveRecord de forma elegante.

Boa sorte!


Where's The Comment Form?

Liked it here?
Why not try sites on the blogroll...

%d blogueiros gostam disto: