Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

NotORM

3,675 views

Published on

Introdução a biblioteca NotORM

Published in: Technology
  • Be the first to comment

  • Be the first to like this

NotORM

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

×