Использование функций SQL в условных выражениях в Drupal 7 db_select ()

9

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

Вот что я попробовал:

$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));
xandeadx
источник
Это работает. Мне даже в голову не пришло это сделать.
Патрик
3

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

Так что вам просто нужно использовать условие LIKE:

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

См. Условные положения для всестороннего объяснения.

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

Бернхард Фюрст
источник
1

Вы все еще можете использовать addExpression.

// Functions - You can use sql functions using addExpression ($expression, $alias = NULL, $arguments = array()).
$query->addExpression('MIN(o.tid)', 'min_term_id');

Ресурс: примеры SQL-запросов в Drupal 7

ram4nd
источник