NotORMAutor:   Tiago DaviE-mail:  tiago.asp.net@gmail.comBlog:     http://tiagodavi.blogspot.com/Twitter: http://twitter.com/#!/tiagoaspnet
IntroduçãoO 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çãoO NotORM pode ser baixado em http://www.notorm.com/Requerimentos:- PHP 5.1 +- Extensão PDO Pode se conectar com qualquer banco de dados suportado pela extensão- MySQL, SQLite, PostgreSQL, MS SQL, Oracle...
Olá NotORMDescompacte 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.phpCrie 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 PDOEscreva o código abaixo no seu arquivo index.php:<?phpinclude '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 NotORM2º  Instanciamos a extensão PDO e nos conectamos ao banco MySQL3º Instanciamos o NotORM e passamos como argumento a conexão PDO
InsertAgora 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 insert1º Criamos um array cujos índices têm os mesmos nomes dos campos na tabela    grupo2º Preenchemos esse array com valores 3º Utilizamos o objeto NotORM em $db para chamar através da seta nossa tabela4º Agora a tabela se comporta como um método e podemos encadear outro    método chamado insert e passar os argumentos para serem inseridos5º Mandamos imprimir a chave primária que acabou de ser inserida
Entendendo o InsertNa 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 InsertQuando 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 InsertA função date_default_timezone_set define o nosso timezone padrão e evita problemas no PHP 5.3O 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.
FindAgora 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 = 1Pode 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
FindNo 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 nossasconsultas:$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")
FetchPairsO 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çãoO 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
UpdatePodemos 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
UpdateNeste 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')
DeletePara 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.
DebugPodemos 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 )
CacheNotORM 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.
FIMPara saber mais consulte a documentação oficial do NotORMhttp://www.notorm.com/#apiAssista NotORM vs Doctrine 2http://www.notorm.com/static/doctrine2-notorm/Participe do grupo no linkedinhttp://www.linkedin.com/groups/NotORM-3941155?gid=3941155 Obrigado.

NotORM

  • 1.
    NotORMAutor: Tiago DaviE-mail: tiago.asp.net@gmail.comBlog: http://tiagodavi.blogspot.com/Twitter: http://twitter.com/#!/tiagoaspnet
  • 2.
    IntroduçãoO 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.
    InstalaçãoO NotORM podeser baixado em http://www.notorm.com/Requerimentos:- PHP 5.1 +- Extensão PDO Pode se conectar com qualquer banco de dados suportado pela extensão- MySQL, SQLite, PostgreSQL, MS SQL, Oracle...
  • 4.
    Olá NotORMDescompacte oarquivo 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 »CREATETABLE `grupo` ( `id` int(11) NOT NULL AUTO_INCREMENT, `nome` varchar(250) NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;
  • 6.
    Tabela «  usuario »CREATETABLE `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 »CREATETABLE `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.phpCrie um arquivochamado 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 PDOEscreva ocódigo abaixo no seu arquivo index.php:<?phpinclude '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 NotORM2º Instanciamos a extensão PDO e nos conectamos ao banco MySQL3º Instanciamos o NotORM e passamos como argumento a conexão PDO
  • 11.
    InsertAgora que configuramosnosso 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 insert1ºCriamos um array cujos índices têm os mesmos nomes dos campos na tabela grupo2º Preenchemos esse array com valores 3º Utilizamos o objeto NotORM em $db para chamar através da seta nossa tabela4º Agora a tabela se comporta como um método e podemos encadear outro método chamado insert e passar os argumentos para serem inseridos5º Mandamos imprimir a chave primária que acabou de ser inserida
  • 13.
    Entendendo o InsertNaverdade 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 InsertQuandofazemos 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 InsertAfunção date_default_timezone_set define o nosso timezone padrão e evita problemas no PHP 5.3O 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.
    FindAgora vamos entendercomo consultar dados, observe este código:$usuario = $db->usuario[1];echo $usuario['nome'];O que este código faz é umSELECT * FROM usuario WHERE id = 1Pode 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.
    FindNo método selectpodemos 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 5usuá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 encadearvários métodos para personalizar nossasconsultas:$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 seubanco 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 pegarum 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 vamosconsultar 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 ONotORM 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.
    FetchPairsO método fetchPairspermite 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çãoO NotORM permiteutilizar 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.
    UpdatePodemos atualizar facilmenteos 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.
    UpdateNeste exemplo estamospegando 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.
    DeletePara 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.
    DebugPodemos criar umafunçã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.
    CacheNotORM permite autilizaçã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.
    FIMPara saber maisconsulte a documentação oficial do NotORMhttp://www.notorm.com/#apiAssista NotORM vs Doctrine 2http://www.notorm.com/static/doctrine2-notorm/Participe do grupo no linkedinhttp://www.linkedin.com/groups/NotORM-3941155?gid=3941155 Obrigado.