[zfbrasil] Como usar LIKE e ILIKE com Zend\Db\Sql [RESOLVIDO]

248 views
Skip to first unread message

Gaba

unread,
May 27, 2013, 9:53:13 AM5/27/13
to zfbr...@googlegroups.com
Bom dia pessoal.

Recentemente vi aqui no grupo, algumas pessoas precisando usar LIKE nas consultas SQL com Zend\Db, e gostaria de deixara a minha contribuição pra quem precisar.

Bom, hoje, precisei usar uma consulta com filtro duplo de like.

Pra entenderem, tenho uma tabela de usuarios (que tem a coluna name e a coluna code), e precisava fazer um campo que pesquisa pelos dois campos. Ou seja, se o usuário digitasse "João" a consulta precisaria procurar por "João" na tabela pelo campo name mas se digitasse "1238CSF1" a consulta precisaria procurar por "1238CSF1" na tabela pelo campo code.

Como é uma pesquisa em ajax, o resultado tem que vir em tempo real, então sou obrigado a usar LIKE. MAS no meu caso, utilizo PGSql, e pelo que sei o LIKE é case sensitive, mas PRECISO que a busca não considere maiúsculas e minúsculas, ENTÃO pra isso, preciso usar o ILIKE do pgsql.

Vamos por partes. Primeiro chamamos a classe Predicate do Zend e depois instanciamos o Like que precisamos:

  1. // use Zend\Db\Sql\Predicate;
  2.  
  3. $name   = new Predicate\Like( 'user.name', "%{$query}%" );

Aqui você já poderia usar diretamente no seu where para filtrar (a var $select representa Zend\Db\Sql\Select):

  1. $select->where( $name );

Mas no meu caso, eu preciso de mais um Like:

  1. // use Zend\Db\Sql\Predicate;
  2.  
  3. $name   = new Predicate\Like( 'user.name', "%{$query}%" );
  4. $code   = new Predicate\Like( 'user.code', "%{$query}%" );

Temos então os dois likes que preciso, e agora vamos adicionar uma PredicateSet pra juntar os dois e usá-los com a cláusula OR do SQL:

  1. $select->where(
  2.         new Predicate\PredicateSet(
  3.                 array(
  4.                         $name,
  5.                         $code,
  6.                 ),
  7.                 Predicate\PredicateSet::COMBINED_BY_OR
  8.         )
  9. );

Neste ponto, uma busca já funcionaria no MySQL por exemplo (acho que o LIKe do mysql não considera case sensitive estou certo?). Mas como estou utilizando PostGreSQL e preciso utilizar a cláusula ILIKE, então temos que mudar a especificação do nosso predicate, setando o mesmo antes de adicionar no where:

  1. $name->setSpecification('%1$s ILIKE %2$s');
  2. $code->setSpecification('%1$s ILIKE %2$s');  

O código todo ficou assim:

  1. // use Zend\Db\Sql\Predicate;
  2.  
  3. $name   = new Predicate\Like( 'user.name', "%{$query}%" );
  4. $code   = new Predicate\Like( 'user.code', "%{$query}%" );
  5.                                                
  6. $name->setSpecification('%1$s ILIKE %2$s');
  7. $code->setSpecification('%1$s ILIKE %2$s');
  8.  
  9. $select->where(
  10.         new Predicate\PredicateSet(
  11.                 array(
  12.                         $name,
  13.                         $code,
  14.                 ),
  15.                 Predicate\PredicateSet::COMBINED_BY_OR
  16.         )
  17. );

Existem outras maneiras de usar LIKE no zend (mas eu acho essa a mais elegante), assim como você também pode usar o PredicateSet com outras cláusulas. 

No que diz respeito ao ILIKE essa foi a maneira que encontrei de usar ILIKE sem ter que fazer uma nova classe apenas para mudar a especificação. Se alguém tiver uma maneira melhor ou mais legal pra usar ILIKE, por favor compartilhe conosco.

Abraços!!!!!

Gaba

unread,
May 27, 2013, 9:54:34 AM5/27/13
to zfbr...@googlegroups.com
Errata, no terceiro parágrafo:

"...e precisava fazer um campo que pesquisa pelos dois campos." => "...e precisava fazer uma consulta que pesquisa pelos dois campos."

Jaime Marcelo Valasek

unread,
May 27, 2013, 11:55:38 AM5/27/13
to zfbr...@googlegroups.com
Correto, pois na class Zend\Db\Sql\Predicate\Like.php tem o protected $specification = '%1$s LIKE %2$s'; que é colocado sempre que se usa a class, mas pode ser setado com o setSpecification passando '%1$s ILIKE %2$s', isso é muito legal e muitas pessoas não conhecem, (XDB) show de bola...


Em 27 de maio de 2013 10:53, Gaba <gaba...@gmail.com> escreveu:

--
--
Essa mensagem faz parte do grupo "zfbrasil" no Google Groups.
Para escrever neste grupo, envie um email para zfbr...@googlegroups.com
Para se desligar do grupo, envie um email para zfbrasil-u...@googlegroups.com
Mais informações, visite o grupo em http://groups.google.com/group/zfbrasil?hl=pt-BR
---
Você está recebendo esta mensagem porque se inscreveu no grupo "Zend Framework Brasil" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para zfbrasil+u...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
 
 

Reply all
Reply to author
Forward
0 new messages