domingo, 21 de abril de 2013

Ignorando acentos em consultas com PHP e PostgreSQL

.

Olá galera,

Nesse post mostrarei um forma prática de se fazer consultas onde acentos são ignorados na busca. Como ultimamente estou trabalhando com Laravel, utilizarei um trecho de código dele para ilustrar. Todavia você pode fazer os ajustes para o framework de sua preferência.

Primeiro utilizaremos o recurso unaccent presente no PostgreSQL 9.1 para tratar os acentos das strings cadastradas no banco. O unaccent é um dicionário de pesquisas textuais que remove os acentos.

O segundo recurso é o transliterator_transliterate presente no PHP 5.4 e transforma uma string ou parte dela através de um ICU transliterator.

    <?php
      $locais = Local::where(DB::raw('unaccent(nome)'), 'ILIKE', "%". transliterator_transliterate('Any-Latin; Latin-ASCII', Input::get('nome')) ."%"); 
    ?>
  

No código acima, estou pesquisando em uma tabela de locais cujo nome foi passado em um formulário de busca fictício. Supondo que o usuário entrou com a string no formulário e na nossa tabela de locais tenhamos cadastrados os nomes: Cuiabá, Barra, Iguatemi, Park Shopping.

O código resultante seria como o abaixo.

    SELECT * FROM locais WHERE unaccent(nome) ILIKE '%ba%'
  

E como resultado da nossa busca teríamos os nomes: Cuiabá, Barra.

OBS: Para que os códigos acima funcionem é necessário instalar o recurso no PostgreSQL e o pacote de internacionalização do PHP. Para o PHP 5.5.3 é necessário instalar o pacote php5-intl e para o PostgreSQL deve se executar CREATE EXTENSION IF NOT EXISTS unaccent

Não é realmente simples?! Um grande abraço e até a próxima.

2 comentários:

  1. Você poderia me indicar um link para baixar shapes da hidrografia do Estado de São Paulo?

    ResponderExcluir
    Respostas
    1. Olá João,

      Eu não tenho um link, mas tenho o shape da bacia hidrográfica do Estado de São Paulo. Terminei de fazer um upload dele para você no link https://onedrive.live.com/redir?resid=8C5EFFAC64E659AD!1847&authkey=!AIJbRLnBy41jLAQ&ithint=file%2czip (bacia_hidrografica_sp)

      Um abraço

      Excluir