Este documento fornece instruções sobre como usar o NotORM, uma biblioteca PHP para trabalhar com dados no banco de dados de forma simples. Ele explica como instalar o NotORM, conectar-se ao banco de dados, inserir, consultar e relacionar dados entre tabelas. Além disso, mostra como personalizar consultas e usar recursos como junções e agregações.
2. Introdução O NotORM é uma biblioteca escrita em PHP para trabalhar com dados simples no banco de dados. Sua principal característica é a facilidade para trabalhar com tabelas relacionadas superando até mesmo o conhecido ORM Doctrine devido a sua simplicidade e performance. NotORM foi criado por JakubVránae o mesmo define a biblioteca como sendo tão simples quanto SimpleXML. É importante enfatizar que o NotORM é mais voltado para projetos pequenos onde se deseja ter uma boa performance associada a rapidez na entrega. Portanto decidir entre NotORM ou Doctrine vai depender do seu projeto.
3.
4. Olá NotORM Descompacte o arquivo baixado em seu servidor local vertrigo, wamp, xampetc ou mesmo em seu servidor online. Vamos utilizar neste curso o banco de dados MySQL portanto crie um novo banco chamado notorm. Por padrão o NotORM está configurado para aceitar tabelas no singular com chaves primárias sendo id e chaves estrangeiras sendo tabela_id. Isso pode ser alterado ser tiver necessidade. Nos próximos slides temos o SQL das tabelas que vamos utilizar neste banco...
5. Tabela « grupo » CREATE TABLE `grupo` ( `id` int(11) NOT NULL AUTO_INCREMENT, `nome` varchar(250) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
6. Tabela « usuario » CREATE TABLE `usuario` ( `id` int(11) NOT NULL AUTO_INCREMENT, `grupo_id` int(11) NOT NULL, `nome` varchar(250) NOT NULL, `email` varchar(250) NOT NULL, `senha` varchar(32) NOT NULL, PRIMARY KEY (`id`), KEY `FK_usuario` (`grupo_id`), CONSTRAINT `FK_usuario` FOREIGN KEY (`grupo_id`) REFERENCES `grupo` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
7. Tabela « noticia » CREATE TABLE `noticia` ( `id` int(11) NOT NULL AUTO_INCREMENT, `usuario_id` int(11) NOT NULL, `titulo` varchar(250) NOT NULL, `conteudo` text NOT NULL, `dt_criacao` date NOT NULL, PRIMARY KEY (`id`), KEY `FK_noticia` (`usuario_id`), CONSTRAINT `FK_noticia` FOREIGN KEY (`usuario_id`) REFERENCES `usuario` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
9. Index.php Crie um arquivo chamado index.php na pasta public_html. Seu servidor deve estar organizado da seguinte forma: public_html/ NotORM/ NotORM tests NotORM.php readme.txt index.php A pasta public_html pode ser sua pasta www ou qualquer outra que tenha configurado localmente.
10. Conexão PDO Escreva o código abaixo no seu arquivo index.php: <?php include 'NotORM/NotORM.php'; $pdo = new PDO('mysql:dbname=notorm;host=127.0.0.1', 'root', 123); $db = new NotORM($pdo); O que estamos fazendo neste código? 1º Incluímos a biblioteca do NotORM 2º Instanciamos a extensão PDO e nos conectamos ao banco MySQL 3º Instanciamos o NotORM e passamos como argumento a conexão PDO
11. Insert Agora que configuramos nosso arquivo vamos aprender como fazer inserts. Escreva o código abaixo no seu arquivo index.php, logo abaixo da sua conexão: <?php $array_grupo = array( 'nome' => 'Administradores' ); $id = $db->grupo() ->insert($array_grupo); echo $id;
12. Entendendo o insert 1º Criamos um array cujos índices têm os mesmos nomes dos campos na tabela grupo 2º Preenchemos esse array com valores 3º Utilizamos o objeto NotORM em $db para chamar através da seta nossa tabela 4º Agora a tabela se comporta como um método e podemos encadear outro método chamado insert e passar os argumentos para serem inseridos 5º Mandamos imprimir a chave primária que acabou de ser inserida
13. Entendendo o Insert Na verdade o insert não retorna a chave primária mas sim um objeto com o último registro que acabou de ser inserido. Então como ele imprime a chave primária? O notORM utiliza o método mágico __toString() que imprime a chave se utilizarmos um construtor de linguagem como o echo. Vamos alterar nosso código para pegar qualquer informação do último insert. Acompanhe...
14. Entendendo o Insert $grupo = $db->grupo() ->insert($array_grupo); echo $grupo['nome']; echo $grupo['id']; Agora podemos perceber que ele imprime tanto o id quanto o nome do grupo que acabamos de inserir. Dê um truncate no seu banco e vamos acompanhar uma das mágicas do NotORM. Vamos alterar novamente nosso código, agora para inserir usuários para um grupo. Acompanhe nos próximos slides...
16. Entendendo o Insert Quando fazemos isso: $grupo->usuario() ->insert($array_usuario); Estamos dizendo que esse usuário será inserido para esse grupo e o relacionamento é criado automaticamente! Confira sua tabela usuario e perceba que o campo grupo_id foi preenchido automaticamente com o id do grupo que foi criado. Vamos agora inserir também uma notícia para o usuário. Dê um truncate no seu banco e acrescente este código...
18. Entendendo o Insert A função date_default_timezone_set define o nosso timezone padrão e evita problemas no PHP 5.3 O objeto NotORM_Literal('NOW()') retorna a data/hora atual. Quando fazemos isso: $usuario->noticia() ->insert($array_noticia); Estamos dizendo que essa notícia será inserida para esse usuário e o relacionamento também foi criado automaticamente! Confira sua tabela usuario e perceba que ele pertence a um grupo e que a noticia criada pertence a esse usuário, o campo dt_criacao exibe a data de cadastro da notícia.
19. Find Agora vamos entender como consultar dados, observe este código: $usuario = $db->usuario[1]; echo $usuario['nome']; O que este código faz é umSELECT * FROM usuario WHERE id = 1 Pode não ser interessante executar um * FROM quando só precisamos por exemplo do endereço de e-mail deste usuário, então podemos executar de outra forma e ganhar em performance, observe: $usuario = $db->usuario('id = ?', 1) ->select('email') ->fetch(); echo $usuario['email']; Este código seria o mesmo que SELECT email FROM usuario WHERE id = 1
20. Find No método select podemos passar os campos da tabela desta forma: $usuario = $db->usuario('id = ?', 1) ->select('nome, email, senha') ->fetch(); echo $usuario['nome']; echo $usuario['email']; echo $usuario['senha']; Vamos inserir mais alguns usuários para exemplificar melhor nossas consultas...
22. Find Inserimos 5 usuários com grupo_id = 1 e agora vamos fazer uma consulta com eles: $usuarios = $db->usuario(); foreach($usuarios as $u){ echo $u['nome'].' - '.$u['email'].'<br />'; } No exemplo acima fizemos SELECT * FROM usuario e temos acesso a todos os campos. Vamos ver um exemplo mais completo...
23. Find Podemos encadear vários métodos para personalizar nossas consultas: $usuarios = $db->usuario() ->select('nome, email') ->where('nome LIKE ?', 'Usuario%') ->order('nome DESC') ->limit(3); foreach($usuarios as $u){ echo $u['nome'].' - '.$u['email'].'<br />'; }
24. Find Limpe seu banco de dados e vamos inserir 2 grupos e 2 usuários para cada grupo: $grupo1 = $db->grupo() ->insert(array('nome' => 'Grupo 1')); $grupo2 = $db->grupo() ->insert(array('nome' => 'Grupo 2')); $grupo1->usuario() ->insert(array('nome' => 'Eduardo', 'email' => 'teste', 'senha' => 'teste')); $grupo2->usuario() ->insert(array('nome' => 'Felipe', 'email' => 'teste', 'senha' => 'teste')); Agora vamos fazer uma consulta a estes usuários...
25. Find $usuarios = $db->usuario() ->select('id, grupo_id, nome, email') ->order('nome DESC'); foreach($usuarios as $u){ echo $u->grupo['nome'].'<br />'; echo $u['nome'].'<br />'; } Através do $u->grupo['nome'] o NotORM pega o nome do grupo de cada usuário! Perceba também que a query que ele faz não é um simples join mas sim uma consulta mais rápida: SELECT * FROM grupo WHERE (grupo.id IN (2, 1)) Observe quetrazemos a chaveestrangeiragrupo_idparaqueissosejapossível: ->select('id, grupo_id, nome, email')
26. Find Vamos pegar um desses usuários : $usuario = $db->usuario(array('nome' => 'Eduardo', 'email' => ‘teste')) ->select('id') ->fetch(); Este código é o mesmo que: SELECT id FROM usuario WHERE nome = 'Eduardo' AND email = 'teste‘ Vamosinserirduasnotíciasparaele: $hoje = newNotORM_Literal('NOW()'); $noticia1 = array('titulo' => 'Teste1', 'conteudo' => 'Teste1', 'dt_criacao' => $hoje); $noticia2 = array('titulo' => 'Teste2', 'conteudo' => 'Teste2', 'dt_criacao' => $hoje); $usuario->noticia() ->insert($noticia1, $noticia2); Observe que podemos inserir dois ou mais arrays de uma só vez!
27. Find Agora vamos consultar uma notícia: $noticias = $db->noticia() ->limit(1); foreach($noticias as $n){ echo $n['titulo'].'<br />'; echo $n->usuario['nome'].'<br />'; echo $n->usuario->grupo['nome'].'<br />'; } Através da notícia podemos pegar o usuário e seu grupo! Poderíamos pegar mais níveis de relacionamento caso existissem.
28. Left Join O NotORM também permite que se faça Left Joins observe: $autores = $db->noticia() ->select('usuario.id, usuario.nome') ->group('usuario.id'); foreach($autores as $a){ echo $a['nome'].'<br />'; } Esta sintaxe usuario.id e usuario.nome faz um leftjoin automático na tabela usuario. Perceba também que ele permite funções de agregação e que estamos agrupando pelo id do usuário e assim trazemos todos os autores de notícias sem redundância. Poderíamos também pegar mais níveis caso existissem: (“tabela1.tabela2.campo")
29. FetchPairs O método fetchPairs permite trazer os dados em pares de arrays associativos: $noticias = $db->noticia() ->fetchPairs('id', 'titulo'); print_r($noticias); Assim ele vai associar para cada índice id o seu respectivo título de notícia. Ele também permite passar apenas um argumento: $noticias = $db->noticia() ->fetchPairs('id'); Dessa forma ele percorre toda a tabela e utiliza como índice o id ou qualquer outro campo que seja definido como argumento.
30. Agregação O NotORM permite utilizar métodos de agregação: $tabela->count('*') $tabela->count('DISTINCT '.$campo) $tabela->min($campo) $tabela->max($campo) $tabela->aggregation("GROUP_CONCAT({$campo})") $usuario = $db->usuario[1]; echo $usuario['nome'].'<br />'; echo 'Total de notícias: '.$usuario->noticia()->count('*'); O código acima pega o total de notícias do usuário 1
31. Update Podemos atualizar facilmente os dados desta forma: $usuario = $db->usuario[1]; echo $usuario['nome'].'<br />'; $usuario['nome'] = 'Jonas'; $usuario->update(); $usuario = $db->usuario[1]; echo $usuario['nome'].'<br />'; Observe que pegamos o usuário 1 que se chamava Eduardo, trocamos o nome dele para Jonas, atualizamos e pegamos novamente para verificar a alteração. Poderíamos atualizar diretamente assim: $db->usuario('id = ?', 2) ->update(array('nome' => 'Mauricio', 'email' => 'mauricio@gmail.com')); Aqui trocamos o nome e o email onde o id = 2
32. Update Neste exemplo estamos pegando o usuário 1 e fazendo uma referência, dessa forma ao invés de copiar; a variável $usuario vai apontar para o mesmo objeto criado pelo fetch e assim economizar memória. $usuario =& $db->usuario() ->select('id') ->where('id = ?', 1) ->fetch(); echo $usuario['id']; Aqui vamos trocar o nome de todos os usuários do grupo 1 através do próprio grupo: $grupo =& $db->grupo[1]; $grupo->usuario() ->update(array('nome' => 'Fernando'));SELECT * FROM grupo WHERE (id = 1) UPDATE usuario SET nome = 'Fernando' WHERE (grupo_id = '1')
33. Delete Para excluir dados é muito simples, vamos excluir o usuário 2: $usuario =& $db->usuario[2]; $usuario->delete(); Agora vamos excluir a notícia 1: $db->noticia('id = ?', 1) ->delete(); Portanto caso esteja com o objeto em mãos simplesmente chame o método delete e caso não esteja mande excluir diretamente como no exemplo acima pois não há necessidade de fazer uma consulta para efetuar uma exclusão, nosso exemplo foi apenas didático e o mesmo vale para o update.
34. Debug Podemos criar uma função de callback para debugar querys observe: $db->debug = 'debug'; $db->noticia('id = ?', 2) ->select('titulo') ->fetch(); function debug($query, $params){ echo $query.'<br />'; print_r($params); } A função de callback recebe a query e um array com os argumentos que foram passados: SELECT titulo FROM noticia WHERE (id = ?)Array ( [0] => 2 )
35. Cache NotORM permite a utilização de cache de várias formas veja: Usar a session $_SESSION["NotORM"] : new NotORM_Cache_SessionCache em disco: new NotORM_Cache_File($arquivo)Incluirarquivo de cache em disco (paraaceleradores de PHP): new NotORM_Cache_Include($arquivo)Com tabela no banco de dados: new NotORM_Cache_Database(PDO $connection)Para Memcache(prefixoMemcache) : new NotORM_Cache_Memcache(Memcache $memcache)Para APC (prefixo APC): new NotORM_Cache_APCO objeto de cache é passadocomo 3º argumento no construtor do NotORM.
36. FIM Para saber mais consulte a documentação oficial do NotORMhttp://www.notorm.com/#api Assista NotORM vs Doctrine 2http://www.notorm.com/static/doctrine2-notorm/ Participe do grupo no linkedinhttp://www.linkedin.com/groups/NotORM-3941155?gid=3941155 Obrigado.