NotORM

3 551 vues

Publié le

Introdução a biblioteca NotORM

Publié dans : Technologie
0 commentaire
0 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

  • Soyez le premier à aimer ceci

Aucun téléchargement
Vues
Nombre de vues
3 551
Sur SlideShare
0
Issues des intégrations
0
Intégrations
735
Actions
Partages
0
Téléchargements
26
Commentaires
0
J’aime
0
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

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 />

×