HUFERSIL.WEBDEVELOPER

Lumine – Tutorial 4 – Trabalhando com a clausula WHERE

Lumine oferece uma forma bem legal e fácil de trabalhar com a clausula WHERE de suas pesquisas.
É no estilo de prepared statement, porém sem precisar de efetuar uma segunda chamada para vincular o valor ao elemento (bind).

Neste tutorial veremos as duas formas de efetuar isso:

  • Através de itens numerados;
  • Nomes para vinculação.

Antes de prosseguir, temos que lembrar o que é necessário para que o método se comporte da maneira como o esperado.
Supondo o seguinte caso:

$usuario = new Usuario;$usuario->where("nome like 'hugo%'")->find();

Lumine irá procurar normalmente, porém, se fizermos isto:

$usuario->where('nome like ?', $_GET['nome'])->find();

Não irá funcionar, por que, conforme explicado na documentação desta cláusula, Lumine não irá tratar os campos da string "automagicamente", pois em sua consulta você poderia ter dois campos com o mesmo nome, porém de tabelas e tipos diferentes. Logo, é necessário que haja uma forma pela qual Lumine identifique de qual entidade é o campo. Você poderá fazê-lo de 3 formas:

  • atribuindo um alias a entidade;
    $usuario->alias('u')        ->where('u.nome like ?', $_GET['nome']);
  • colocando o nome do campo entre chaves ( {campo} );
    $usuario->where('{nome} like ?', $_GET['nome']);
  • caso esteja efetuando um join, colocar o nome da classe e campo entre chaves ( {Classe.campo} );
    $usuario->where('{Usuario.nome} like ?', $_GET['nome']);

Das três, a que eu recomendo por ser mais rápida e de acordo com os padrões que você provavelmente já deva estar acostumado, é atribuir um alias para a entidade. Além de ser mais prático por não precisar ficar digitando as chaves, fica mais fácil e curta a identificação.

Prepared Statement através de itens numerados

Esta é a forma mais simples e que eu particularmente mais uso.
O método where recebe como primeiro argumento a condição que será analisada. Para atribuir um valor a um campo, você utiliza o ponto de interrogação ( ? ) como coringa. O restante dos paramêtros, serão utilizados para substituição dos coringas, por exemplo:

$usuario->alias('u')        ->where('u.nome like ? and u.email = ? and u.senha = ?', $_GET['nome'], $_GET['email'], $_GET['senha'])        ->find();

Você também poderá verificar se o campo está dentro de uma lista.

$codigos = array(3, 7, 8, 13, 103);$usuario->alias('u')        ->where('u.codusuario IN ( ? )', $codigos)        ->find();

Comparações testadas:

  • u.nome = ?
  • u.nome != ?
  • u.nome <> ?
  • u.nome > ?
  • u.nome < ?
  • u.nome <= ?
  • u.nome >= ?
  • u.nome IN ( ? )
  • u.nome NOT IN (?)
  • u.nome LIKE ?
  • u.nome NOT LIKE ?
  • u.nome ILIKE ?

Atenção: este método só funciona com os membros que existam em suas entidades. Ele não substituirá expressões criadas na clausula SELECT ou qualquer outra parte.

Prepared Statement através de nomes para vinculação

Praticamente igual ao anterior, com a exceção de que o segundo argumento deve ser uma matriz associativa, contendo os nomes dos valores que serão vinculados (bind) às expressões e que não será utilizado o ponto de interrogação como coringa, e sim dois-pontos ( : ) seguido do nome que se deseja, por exemplo :nome.

$dados = array(  'email' => 'eu@hufersil.com.br',  'senha' => '12345');

$usuario->alias('u')        ->where('u.email = :email AND u.senha = :senha', $dados)        ->find();

Exemplo prático

Com os códigos abaixo, crie um arquivo chamado prepared.php e grave em sua pasta de testes para poder acessar via navegador.

<?php

// importa as configuraçõesrequire_once 'config.php';

// importa a classe de usuárioLumine::import('Usuario');

// hablita o logLumine_Log::setLevel(3);

//  instancia o usuario$usuario = new Usuario;

$usuario->alias('a')                     // muda o alias    ->where('a.email = :email', $_GET)   // indica o email que vem do GET    ->count();                           // conta os usuarios com o mesmo email

// reinicia o objeto$usuario->reset();

// muda o alias$usuario->alias('u')    // indica o email e senha	->where('u.email = ? AND u.senha = ?', $_GET['email'], $_GET['senha'])	// efetua a consulta	->find();

Agora, em seu navegador, acesse o endereço que você criou com os dados na URL, no meu caso ficou:

http://localhost/teste/prepared.php?email=eu@hufersil.com.br&senha=12345

Na próxima veremos como fazer consultas com união de classes!

@braços e fiquem com Deus!

Deixar uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

*

Pode usar estas etiquetas HTML e atributos: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">