2010-11-08 14 views

risposta

21

Dipende principalmente dal server di database. Un LIKE con MySQL è case insensitive come PostgreSQL è case sensitive. Ma si può aiutare se stessi con qualcosa di simile:

$pattern = strtolower('HEllO WorlD'); 
$q = Doctrine_Query::create() 
     ->select('u.username') 
     ->from('User u') 
     ->where("LOWER(u.username) LIKE ?", $pattern); 
+0

E che dire degli indici sulla colonna del nome utente? – Jekis

0

Altra cosa che puoi fare è:

$qb->andWhere($qb->expr()->like('lower(o.name)', ':name')); 

$qb->setParameter('name', '%'. strtolower($search) . '%'); 

saluti.

3

Inoltre, si può provare:

$queryBuilder->where('LOWER(b.title) LIKE LOWER(:query)') 
     ->setParameter('query', '%' . $query . '%'); 

Importante: Dopo la conversione di una stringa che contiene i caratteri speciali in minuscolo con strtolower(), i caratteri speciali non appaiono corrette.

0

Il modo migliore per fare questo è avere una colonna nome utente canonizzata, in quella colonna è possibile memorizzare la versione in minuscolo della colonna nome utente e qualsiasi altro processo di canonizzazione che si desidera fare e cercare e indicizzare quella colonna al posto del nome utente colonna, quindi basta fare

->where("u.canonic_username) LIKE ?", $pattern); 

In questo modo è possibile utilizzare gli indici e tutto il resto.

-1
$q = Doctrine_Query::create() 
$q->select('t') 
    ->from('database_table t') 
    ->where($q->expr()->like('t.search_field', ':search_text')) 
    ->setParameter('search_text', '%'.strtolower($searchText).'%'); 
+0

Questa risposta è stata contrassegnata come di bassa qualità. Potresti spiegare il tuo codice e perché risolve il problema? – AJFarmar

Problemi correlati