SlideShare uma empresa Scribd logo
1 de 36
NotORM Autor:   Tiago Davi E-mail:  tiago.asp.net@gmail.com Blog:     http://tiagodavi.blogspot.com/ Twitter: http://twitter.com/#!/tiagoaspnet
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.
Instalação O NotORM pode ser baixado em http://www.notorm.com/ Requerimentos: - PHP 5.1 + - Extensão PDO ,[object Object],- MySQL, SQLite, PostgreSQL, MS SQL, Oracle...
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...
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;
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;
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;
Banco « notorm » Esta é a representação gráfica do nosso banco:
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.
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
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;
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
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...
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...
Entendendo o Insert $array_grupo = array( 	'nome' => 'Administradores' ); $grupo = $db->grupo() 	       ->insert($array_grupo);			 $array_usuario = array( 	'nome'  => 'Fulano',  	'email' => 'fulano@gmail.com',  	'senha' => 123 );	 $grupo->usuario()            ->insert($array_usuario);
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...
Entendendo o Insert $usuario = $grupo->usuario() 		 ->insert($array_usuario);		  date_default_timezone_set('America/Sao_Paulo');	 $array_noticia = array( 	'titulo' => 'Teste', 	'conteudo' => 'Testando Conteúdo', 	'dt_criacao' => new NotORM_Literal('NOW()') );		  	  $usuario->noticia() 	->insert($array_noticia);
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.
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
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...
Find  $grupo = $db->grupo('id = ?', 1) 	       ->select('id') 	      ->fetch(); for($i=0;$i<5; $i++){ 	$grupo->usuario() 	           ->insert(  		   array( 			'nome'  => 'Usuario'.$i, 			'email'  => 'usuario'.$i.'@gmail.com', 			'senha' => '123' 		) 	); }
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...
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 />'; }
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...
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')
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!
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.
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")
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.
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
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
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')
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.
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 )
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.
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.

Mais conteúdo relacionado

Mais procurados

(A13) LabMM3 - JavaScript - Arrays multidimensionais
(A13) LabMM3 - JavaScript - Arrays multidimensionais(A13) LabMM3 - JavaScript - Arrays multidimensionais
(A13) LabMM3 - JavaScript - Arrays multidimensionaisCarlos Santos
 
Computação Científica com Python, Numpy e Scipy
Computação Científica com Python, Numpy e ScipyComputação Científica com Python, Numpy e Scipy
Computação Científica com Python, Numpy e ScipyMarcel Caraciolo
 
Crawling - Coleta de dados na Web com PHP
Crawling - Coleta de dados na Web com PHP Crawling - Coleta de dados na Web com PHP
Crawling - Coleta de dados na Web com PHP Luis Gustavo Almeida
 
Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017 Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017 Luis Gustavo Almeida
 
LabMM4 (T14 - 12/13) - Arrays
LabMM4 (T14 - 12/13) - ArraysLabMM4 (T14 - 12/13) - Arrays
LabMM4 (T14 - 12/13) - ArraysCarlos Santos
 
PHP Community Summit - Do REST ao GraphQL com PHP
PHP Community Summit - Do REST ao GraphQL com PHPPHP Community Summit - Do REST ao GraphQL com PHP
PHP Community Summit - Do REST ao GraphQL com PHPBruno Neves Menezes
 
Introdução a python módulo a
Introdução a python   módulo aIntrodução a python   módulo a
Introdução a python módulo aJader Gabriel
 
Object Calisthenics: relaxe e escreva códigos simples
Object Calisthenics: relaxe e escreva códigos simplesObject Calisthenics: relaxe e escreva códigos simples
Object Calisthenics: relaxe e escreva códigos simplesOtávio Calaça Xavier
 
Aula 3 - Java Prof.ª Cristiane Fidelix
Aula 3 -  Java Prof.ª Cristiane FidelixAula 3 -  Java Prof.ª Cristiane Fidelix
Aula 3 - Java Prof.ª Cristiane FidelixCris Fidelix
 

Mais procurados (15)

(A13) LabMM3 - JavaScript - Arrays multidimensionais
(A13) LabMM3 - JavaScript - Arrays multidimensionais(A13) LabMM3 - JavaScript - Arrays multidimensionais
(A13) LabMM3 - JavaScript - Arrays multidimensionais
 
Php 04 Mysql
Php 04 MysqlPhp 04 Mysql
Php 04 Mysql
 
Computação Científica com Python, Numpy e Scipy
Computação Científica com Python, Numpy e ScipyComputação Científica com Python, Numpy e Scipy
Computação Científica com Python, Numpy e Scipy
 
Crawling - Coleta de dados na Web com PHP
Crawling - Coleta de dados na Web com PHP Crawling - Coleta de dados na Web com PHP
Crawling - Coleta de dados na Web com PHP
 
Ecommerce, mais simples do que parece
Ecommerce, mais simples do que pareceEcommerce, mais simples do que parece
Ecommerce, mais simples do que parece
 
Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017 Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017
 
Aula 02 - Curso PHP e MySQL
Aula 02 - Curso PHP e MySQLAula 02 - Curso PHP e MySQL
Aula 02 - Curso PHP e MySQL
 
PHP FrameWARks - FISL
PHP FrameWARks - FISLPHP FrameWARks - FISL
PHP FrameWARks - FISL
 
LabMM4 (T14 - 12/13) - Arrays
LabMM4 (T14 - 12/13) - ArraysLabMM4 (T14 - 12/13) - Arrays
LabMM4 (T14 - 12/13) - Arrays
 
PHP Community Summit - Do REST ao GraphQL com PHP
PHP Community Summit - Do REST ao GraphQL com PHPPHP Community Summit - Do REST ao GraphQL com PHP
PHP Community Summit - Do REST ao GraphQL com PHP
 
Do REST ao GraphQL com PHP
Do REST ao GraphQL com PHPDo REST ao GraphQL com PHP
Do REST ao GraphQL com PHP
 
Tw Course Ajax 2007 Ap05
Tw Course Ajax 2007 Ap05Tw Course Ajax 2007 Ap05
Tw Course Ajax 2007 Ap05
 
Introdução a python módulo a
Introdução a python   módulo aIntrodução a python   módulo a
Introdução a python módulo a
 
Object Calisthenics: relaxe e escreva códigos simples
Object Calisthenics: relaxe e escreva códigos simplesObject Calisthenics: relaxe e escreva códigos simples
Object Calisthenics: relaxe e escreva códigos simples
 
Aula 3 - Java Prof.ª Cristiane Fidelix
Aula 3 -  Java Prof.ª Cristiane FidelixAula 3 -  Java Prof.ª Cristiane Fidelix
Aula 3 - Java Prof.ª Cristiane Fidelix
 

Destaque

Campus M21 | Medienpraxis III: Online / Social Media - Vorlesung II
Campus M21 | Medienpraxis III: Online / Social Media - Vorlesung IICampus M21 | Medienpraxis III: Online / Social Media - Vorlesung II
Campus M21 | Medienpraxis III: Online / Social Media - Vorlesung IIDaniel Rehn
 
SQL Server 2008 'Best Practices' - Stéphane Haby, dbi services - Mövenpick La...
SQL Server 2008 'Best Practices' - Stéphane Haby, dbi services - Mövenpick La...SQL Server 2008 'Best Practices' - Stéphane Haby, dbi services - Mövenpick La...
SQL Server 2008 'Best Practices' - Stéphane Haby, dbi services - Mövenpick La...dbi services
 
Apresentação Java Web Si Ufc Quixadá
Apresentação Java Web Si Ufc QuixadáApresentação Java Web Si Ufc Quixadá
Apresentação Java Web Si Ufc QuixadáZarathon Maia
 
Campus M21 | Medienpraxis II: Online - Vorlesung III vom 11.02.2013
Campus M21 | Medienpraxis II: Online - Vorlesung III vom 11.02.2013Campus M21 | Medienpraxis II: Online - Vorlesung III vom 11.02.2013
Campus M21 | Medienpraxis II: Online - Vorlesung III vom 11.02.2013Daniel Rehn
 
Dominator: Rectifieuse plane de profils à CN et avance lente de Jones & Shipman
Dominator: Rectifieuse plane de profils à CN et avance lente de Jones & ShipmanDominator: Rectifieuse plane de profils à CN et avance lente de Jones & Shipman
Dominator: Rectifieuse plane de profils à CN et avance lente de Jones & Shipmanjonesshipman
 
Otimizando aplicações Zend Framework - Tchelinux
Otimizando aplicações Zend Framework - TchelinuxOtimizando aplicações Zend Framework - Tchelinux
Otimizando aplicações Zend Framework - TchelinuxElton Minetto
 
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 31.01.2013
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 31.01.2013Campus M21 | Medienpraxis II: Online - Vorlesung I vom 31.01.2013
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 31.01.2013Daniel Rehn
 
ECM-Webinar: Alfresco Migration Bestandsdaten Teil 2
ECM-Webinar: Alfresco Migration Bestandsdaten Teil 2ECM-Webinar: Alfresco Migration Bestandsdaten Teil 2
ECM-Webinar: Alfresco Migration Bestandsdaten Teil 2dmc digital media center GmbH
 
Ligação do Flex a um backend LAMP usando AMFPHP
Ligação do Flex a um backend LAMP usando AMFPHPLigação do Flex a um backend LAMP usando AMFPHP
Ligação do Flex a um backend LAMP usando AMFPHPelliando dias
 
02.10.2011 SC B.A.T II
02.10.2011   SC B.A.T II02.10.2011   SC B.A.T II
02.10.2011 SC B.A.T IIHerdwangerSV
 
Què ha fet ICV-EUiA amb el meu vot?
Què ha fet ICV-EUiA amb el meu vot?Què ha fet ICV-EUiA amb el meu vot?
Què ha fet ICV-EUiA amb el meu vot?iniciativaverds
 
Atelier agile 2009_09_27
Atelier agile 2009_09_27Atelier agile 2009_09_27
Atelier agile 2009_09_27domidp
 
2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.
2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.
2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.MongoDB
 
Présentation LMAX Disruptor So@t
Présentation LMAX Disruptor So@tPrésentation LMAX Disruptor So@t
Présentation LMAX Disruptor So@tFrancois Ostyn
 
Lean Kanban FR 2013 - Vin et kanban
Lean Kanban FR 2013 - Vin et kanbanLean Kanban FR 2013 - Vin et kanban
Lean Kanban FR 2013 - Vin et kanbanJulien Fallet
 
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 30.01.2013
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 30.01.2013Campus M21 | Medienpraxis II: Online - Vorlesung I vom 30.01.2013
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 30.01.2013Daniel Rehn
 

Destaque (20)

Campus M21 | Medienpraxis III: Online / Social Media - Vorlesung II
Campus M21 | Medienpraxis III: Online / Social Media - Vorlesung IICampus M21 | Medienpraxis III: Online / Social Media - Vorlesung II
Campus M21 | Medienpraxis III: Online / Social Media - Vorlesung II
 
SQL Server 2008 'Best Practices' - Stéphane Haby, dbi services - Mövenpick La...
SQL Server 2008 'Best Practices' - Stéphane Haby, dbi services - Mövenpick La...SQL Server 2008 'Best Practices' - Stéphane Haby, dbi services - Mövenpick La...
SQL Server 2008 'Best Practices' - Stéphane Haby, dbi services - Mövenpick La...
 
Apresentação Java Web Si Ufc Quixadá
Apresentação Java Web Si Ufc QuixadáApresentação Java Web Si Ufc Quixadá
Apresentação Java Web Si Ufc Quixadá
 
Campus M21 | Medienpraxis II: Online - Vorlesung III vom 11.02.2013
Campus M21 | Medienpraxis II: Online - Vorlesung III vom 11.02.2013Campus M21 | Medienpraxis II: Online - Vorlesung III vom 11.02.2013
Campus M21 | Medienpraxis II: Online - Vorlesung III vom 11.02.2013
 
Dominator: Rectifieuse plane de profils à CN et avance lente de Jones & Shipman
Dominator: Rectifieuse plane de profils à CN et avance lente de Jones & ShipmanDominator: Rectifieuse plane de profils à CN et avance lente de Jones & Shipman
Dominator: Rectifieuse plane de profils à CN et avance lente de Jones & Shipman
 
Tutorialphpmyadmin
TutorialphpmyadminTutorialphpmyadmin
Tutorialphpmyadmin
 
Otimizando aplicações Zend Framework - Tchelinux
Otimizando aplicações Zend Framework - TchelinuxOtimizando aplicações Zend Framework - Tchelinux
Otimizando aplicações Zend Framework - Tchelinux
 
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 31.01.2013
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 31.01.2013Campus M21 | Medienpraxis II: Online - Vorlesung I vom 31.01.2013
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 31.01.2013
 
ECM-Webinar: Alfresco Migration Bestandsdaten Teil 2
ECM-Webinar: Alfresco Migration Bestandsdaten Teil 2ECM-Webinar: Alfresco Migration Bestandsdaten Teil 2
ECM-Webinar: Alfresco Migration Bestandsdaten Teil 2
 
Ligação do Flex a um backend LAMP usando AMFPHP
Ligação do Flex a um backend LAMP usando AMFPHPLigação do Flex a um backend LAMP usando AMFPHP
Ligação do Flex a um backend LAMP usando AMFPHP
 
02.10.2011 SC B.A.T II
02.10.2011   SC B.A.T II02.10.2011   SC B.A.T II
02.10.2011 SC B.A.T II
 
Què ha fet ICV-EUiA amb el meu vot?
Què ha fet ICV-EUiA amb el meu vot?Què ha fet ICV-EUiA amb el meu vot?
Què ha fet ICV-EUiA amb el meu vot?
 
Atelier agile 2009_09_27
Atelier agile 2009_09_27Atelier agile 2009_09_27
Atelier agile 2009_09_27
 
2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.
2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.
2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.
 
Présentation LMAX Disruptor So@t
Présentation LMAX Disruptor So@tPrésentation LMAX Disruptor So@t
Présentation LMAX Disruptor So@t
 
MySQL Query Optimization
MySQL Query OptimizationMySQL Query Optimization
MySQL Query Optimization
 
Einführung in SCRUM
Einführung in SCRUMEinführung in SCRUM
Einführung in SCRUM
 
Lean Kanban FR 2013 - Vin et kanban
Lean Kanban FR 2013 - Vin et kanbanLean Kanban FR 2013 - Vin et kanban
Lean Kanban FR 2013 - Vin et kanban
 
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 30.01.2013
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 30.01.2013Campus M21 | Medienpraxis II: Online - Vorlesung I vom 30.01.2013
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 30.01.2013
 
Digitale Mentalität II
Digitale Mentalität IIDigitale Mentalität II
Digitale Mentalität II
 

Semelhante a NotORM guia completo para iniciantes

Semelhante a NotORM guia completo para iniciantes (20)

Otimização e Escalabilidade
Otimização e EscalabilidadeOtimização e Escalabilidade
Otimização e Escalabilidade
 
Introdução ao MongoDB
Introdução ao MongoDBIntrodução ao MongoDB
Introdução ao MongoDB
 
Php 03 Sessoes Cookies Cabecalhos
Php 03 Sessoes Cookies CabecalhosPhp 03 Sessoes Cookies Cabecalhos
Php 03 Sessoes Cookies Cabecalhos
 
Php 07 Cakephp
Php 07 CakephpPhp 07 Cakephp
Php 07 Cakephp
 
Zend Framework
Zend FrameworkZend Framework
Zend Framework
 
Apostila PhP com Wamp 3a Parte
Apostila PhP com Wamp 3a ParteApostila PhP com Wamp 3a Parte
Apostila PhP com Wamp 3a Parte
 
Mini Curso de Python para Coding Dojo
Mini Curso de Python para Coding DojoMini Curso de Python para Coding Dojo
Mini Curso de Python para Coding Dojo
 
Aula 12 Relatório - Tabelas
Aula 12   Relatório - TabelasAula 12   Relatório - Tabelas
Aula 12 Relatório - Tabelas
 
Ecommerce, mais simples do que parece
Ecommerce, mais simples do que pareceEcommerce, mais simples do que parece
Ecommerce, mais simples do que parece
 
Php 08 Oo
Php 08 OoPhp 08 Oo
Php 08 Oo
 
MYSQL - TLBDII
MYSQL - TLBDIIMYSQL - TLBDII
MYSQL - TLBDII
 
Fundamentos de SQL - Parte 3 de 8
Fundamentos de SQL - Parte 3 de 8Fundamentos de SQL - Parte 3 de 8
Fundamentos de SQL - Parte 3 de 8
 
MongoDB - Iniciando e Conhecendo
MongoDB - Iniciando e ConhecendoMongoDB - Iniciando e Conhecendo
MongoDB - Iniciando e Conhecendo
 
Ganhando tempo com casos de testes
Ganhando tempo com casos de testesGanhando tempo com casos de testes
Ganhando tempo com casos de testes
 
Python 02
Python 02Python 02
Python 02
 
Aula 8 php
Aula 8 phpAula 8 php
Aula 8 php
 
Palestra MongoDB
Palestra MongoDBPalestra MongoDB
Palestra MongoDB
 
MongoDB
MongoDBMongoDB
MongoDB
 
ORM: Sendo produtivo com NHibernate
ORM: Sendo produtivo com NHibernateORM: Sendo produtivo com NHibernate
ORM: Sendo produtivo com NHibernate
 
Da argila ao forte: como desenvolver uma loja com PagSeguro
Da argila ao forte: como desenvolver uma loja com PagSeguroDa argila ao forte: como desenvolver uma loja com PagSeguro
Da argila ao forte: como desenvolver uma loja com PagSeguro
 

NotORM guia completo para iniciantes

  • 1. NotORM Autor: Tiago Davi E-mail: tiago.asp.net@gmail.com Blog: http://tiagodavi.blogspot.com/ Twitter: http://twitter.com/#!/tiagoaspnet
  • 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;
  • 8. Banco « notorm » Esta é a representação gráfica do nosso banco:
  • 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...
  • 15. Entendendo o Insert $array_grupo = array( 'nome' => 'Administradores' ); $grupo = $db->grupo() ->insert($array_grupo); $array_usuario = array( 'nome' => 'Fulano', 'email' => 'fulano@gmail.com', 'senha' => 123 ); $grupo->usuario() ->insert($array_usuario);
  • 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...
  • 17. Entendendo o Insert $usuario = $grupo->usuario() ->insert($array_usuario); date_default_timezone_set('America/Sao_Paulo'); $array_noticia = array( 'titulo' => 'Teste', 'conteudo' => 'Testando Conteúdo', 'dt_criacao' => new NotORM_Literal('NOW()') ); $usuario->noticia() ->insert($array_noticia);
  • 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...
  • 21. Find $grupo = $db->grupo('id = ?', 1) ->select('id') ->fetch(); for($i=0;$i<5; $i++){ $grupo->usuario() ->insert( array( 'nome' => 'Usuario'.$i, 'email' => 'usuario'.$i.'@gmail.com', 'senha' => '123' ) ); }
  • 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.