Este post nasceu da necessidade de explicar um pouco mais o funcionamento do Data Mapper para o framework Code Igniter, para ficar mais fácil fazers posts mais avançados utilizando esta ótima ferramenta.
O que é Object-relational mapping (ORM)?
ORM é uma técnica que facilita o acesso e manipulação de banco de dados "transformando-os" como se fossem objetos.
Utilizando ORM o desenvolvedor não precisa se preocupar em escrever a SQL diretamente, a ferramenta ORM (no meu caso o Data Mapper) representa as tabelas do banco de dados com classes, e instâncias destas classes fazem as manipulações e consultas necessárias.
As principais vantagens do ORM é a produtividade, pois o código escrito reduz bastante, facilitando desenvolver e manter aplicações.
Eu comecei recentemente a utilizar o Code Igniter (o primeiro projeto é o novo And After) e estou gostando muito, estou muito mais produtivo mesmo trabalhando com linguagem e ferramentas que ainda não domino completamente: PHP, Code Igniter e ORM.
Database,database… qual era aquela coluna mesmo?
Data Mapper
Data Mapper (DM) é um ORM para quem utiliza o framework Code Igniter (CI), e facilita muito qualquer consulta e manipulação ao banco.
O primeiro passo é instalar o Data Mapper no seu CI, seguindo os passos abaixo:
- Baixe a última versão do DM e descompacte
- Opcional: faça suas configurações do DM no arquivo application/config/datamapper.php
- Coloque o application/config/datamapper.php na pasta application/config folder do seu CodeIgniter
- Coloque o application/libraries/datamapper.php na pasta application/libraries do seu Code Igniter.
- Coloque o application/languages/english/datamapper_lang.php na pasta application/language/english do seu Code Igniter (aqui você pode adicionar os idiomas que quiser, eles contem as mensagens de erro do DM).
- Configue o application/config/autoload.php e adicione a biblioteca do datamapper e database no array do autoload
$autoload["libraries"] = array("database", "datamapper");
Com isso seu aplicativo deve estar pronto para utilizar o Data Mapper!
Abaixo vou publicar exemplos básicos de uso do Data Mapper para consultar o seu banco alterar e inserir dados. Será bem superficial, o objetivo deste post é introduzir ORM e o Data Mapper para quem está começando ou pretende começar a utilizar o Code Igniter.
Começando – uma classe para cada tabela
Relembrando: utilizando uma ferramenta ORM (neste caso o Data Mapper) cada tabela será representada por uma classe no seu Model (usando MVC), e esta classe extenderá a classe do Data Mapper.
Como exemplo vou usar parte do código do backend desenvolvido para o And After, temos uma tabela users, então na camada Model temos a seguinte classe:
class User extends DataMapper {
var $table = "users";
function User()
{
parent::DataMapper();
}
}
Neste exemplo acima a definição da variável $table é opcional, pois quando ela não está definida o Data Mapper automaticamente define table como o plural (adicionando o "s" ao final) do nome da sua classe.
Consultando o banco de dados – Função Get
Agora vamos ver como o Data Mapper aumenta a produtividade no desenvolvimento, no exemplo abaixo vou fazer uma consulta que retorne todas as linhas e colunas da tabela users, utilizando a classe User criada no exemplo acima.
$u = new User();
$u->get();
Fácil assim, o $u é um objeto com todos os resultados da nossa consulta que seria o mesmo que:
get * from users
Limit
Sabemos que não é bom para a performance da nossa aplicação o get * e nem consultas sem um LIMIT definido, para definir o limite é simples, vamos retornar 5 usuários apenas:
$u = new User();
$u->get(5);
E no exemplo abaixo, pegando 5 usuários começando a partir do 10:
$u = new User();
$u->get(5,10);
Selecionando as colunas – select
E agora selecionando as colunas que serão retornadas para evitar consultar dados desnecessários, vamos pegar apenas o user e email dos usuários.
$u = new User();
$u->select("user,email");
$u->get(5);
Fazendo buscas – where
Vamos buscar o usuário que tenha o user "tester":
$u = new User();
$u->where("user", "tester");
$u->get(1);
Você pode usar diversos "where" em uma mesma consulta, e existe também o "or_where" como no exemplo abaixo:
Fazendo buscas – or_where
$u = new User();
$u->where("user", "tester");
$u->or_where("id", "1");
$u->get();
Neste caso vai retornar 1 user se o user com ID 1 for o "tester" ou dois, caso eles sejam diferentes.
Ordenando a consulta – order_by
Pegando 15 usuários ordenados pelo nome:
$u = new User();
$u->order_by("name asc")
$u->get(15);
Aqui estão os exemplos básicos de consultas utilizando o Data Mapper, recomendo que você leia e releia a documentação da função Get (en) para consultas avançadas.
Manipulando os objetos da consulta
Agora você aprendeu a fazer a consulta, já tem sua camada de Model estruturada com uma classe para cada tabela, vamos manipular os dados!
Para exemplificar como é a manipulação dos dados de uma consulta, vamos criar um array com o nome dos últimos usuários cadastrados:
//Consulta os usuários ordenado pela data
$u = new User();
$u->select("name");
$u->order_by("date DESC");
$u->get(10);
//Vamos criar um array com o nome dos usuários da consulta acima
$arr = array();
foreach ($u->all as $user)
{
$arr[] = $user->name;
}
Quando o resultado é apenas um objeto pode ser feito da seguinte forma:
$u = new User();
$u->select("id,name");
$u->get(1);
echo $u->id ." - ". $u->name;
Espero que você, que usa o Code Igniter mas ainda não usa o Data Mapper em breve seja mais um adepto!
O próximo post sobre o Code Igniter será o relato da dificuldade que tive para estruturar a primeira aplicação e dividir corretamente as camadas Model, View e Controller (MVC) e do Data Mapper já tenho um começado que trata de relacionamento de tabelas do banco de dados utilizando esta ferramenta.
Espero que gostem, dúvidas, críticas e sugestões nos comentários!