Використання функцій SQL в умовних умовах у Drupal 7 db_select ()


9

Я намагаюся записати умову в пункт SQL WHERE, який змушує порівняння стовпців зі змінною порівнювати в малі регістри. Однак функція addExpression не виконує цього (оскільки це ставить вираз у полі вибору поля, а не де пункт.

Ось що я спробував:

$category = 'mobile wifi';
$query = db_select('taxonomy_term_data', 'ttd')
    ->fields('ttd', array('tid'));
$query->innerJoin('taxonomy_vocabulary', 'tv', 'ttd.vid = tv.vid');
$query->addExpression("LOWER(ttd.name) = $category");
$result = $query->condition('machine_name', 'images_cat', '=')
    ->execute()
    ->fetchAssoc();

І це:

$category = 'mobile wifi';
$query = db_select('taxonomy_term_data', 'ttd')
    ->fields('ttd', array('tid'));
$query->innerJoin('taxonomy_vocabulary', 'tv', 'ttd.vid = tv.vid');
$result = $query->condition('machine_name', 'images_cat', '=')
    ->condition('LOWER(ttd.name)', $category, '=')
    ->execute()
    ->fetchAssoc();

Другий стає недійсним, і перший викликає проблему, про яку я згадував вище. Якісь думки чи пропозиції?

Спасибі, Патріку

Відповіді:


15

змінити

$query->addExpression("LOWER(ttd.name) = $category");

до

$query->where('LOWER(ttd.name) = :category', array(':category' => $category));

Це працює. Мені навіть не спало на думку зробити це.
Патрік

3

Використання LOWER()вважається повільним у MySQL. Це також не потрібно, оскільки LIKEв API даних Datapal (DBTNG) нечутливі регістри, принаймні, коли ваша таблиця MySQL налаштована для використання одного з зіставлень * _ci. Стандартна установка MySQL використовує * utf8_general_ci * і так само Drupal.

Тому вам просто потрібно використовувати умову LIKE:

$query->condition('name', $category, 'LIKE');

Див. Умовні положення для вичерпного пояснення.

BTW: Драйвер бази даних на основі DBTNG несе відповідальність за реалізацію нечутливого до регістру LIKE. Наприклад, PostgreSQL використовує ILIKE замість LIKE, яким обробляється, включає / database / pgsql / database.inc .


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.