2010-11-08 2 views

ответ

21

Это зависит от базы данных. LIKE с MySQL нечувствителен к регистру, как и PostgreSQL, чувствителен к регистру. Но вы можете помочь себе что-то вроде этого:

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

А как насчет индексов в столбце имени пользователя? – Jekis

0

Другое, что вы можете сделать, это:

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

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

С уважением.

3

Кроме того, вы можете попробовать:

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

Важно: После преобразования строку, содержащую специальные символы в нижний регистр с strtolower(), специальные символы не отображаются правильно.

0

Лучший способ сделать это - иметь канонизированный столбец имени пользователя, в этом столбце вы можете сохранить строчную версию столбца имени пользователя и любой другой процесс канонизации, который вы хотите сделать, и выполнить поиск и индексировать этот столбец вместо имени пользователя колонка, то просто сделайте

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

Таким образом, вы можете использовать индексы и все такое.

-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

Этот ответ отмечен как некачественный. Не могли бы вы объяснить свой код и почему он решает проблему? – AJFarmar

Смежные вопросы