Używanie funkcji SQL w warunkach w Drupal 7 db_select ()

9

Usiłuję napisać warunek w klauzuli SQL WHERE, która wymusza porównywanie kolumn ze zmienną małymi literami. Jednak funkcja addExpression tego nie osiąga (ponieważ umieszcza to wyrażenie w polu wyboru, a nie w klauzuli where.

Oto, co próbowałem:

$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();

I to:

$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();

Drugi staje się nieważny, a pierwszy powoduje problem, o którym wspomniałem powyżej. Wszelkie myśli lub sugestie?

Dzięki, Patrick

Patrick
źródło

Odpowiedzi:

15

zmiana

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

do

$query->where('LOWER(ttd.name) = :category', array(':category' => $category));
xandeadx
źródło
To działa. Nawet mi to nie przyszło do głowy.
Patrick,
3

Używanie LOWER()jest uważane za wolne w MySQL. Nie jest to również konieczne, ponieważ LIKEw API bazy danych Drupala (DBTNG) nie jest rozróżniana wielkość liter, przynajmniej wtedy, gdy twoja tabela MySQL jest skonfigurowana do używania jednego z zestawień * _ci. Standardowa instalacja MySQL używa * utf8_general_ci *, podobnie jak Drupal.

Musisz więc użyć warunku LIKE:

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

Zobacz warunkowego klauzule kompleksowej wyjaśnieniu.

BTW: Sterownik bazy danych oparty na DBTNG jest odpowiedzialny za implementację LIKE bez rozróżniania wielkości liter. Na przykład PostgreSQL używa ILIKE zamiast LIKE, który jest obsługiwany w include / database / pgsql / database.inc .

Bernhard Fürst
źródło
1

Nadal możesz używać addExpression.

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

Zasób: Przykłady zapytań SQL w Drupal 7

ram4nd
źródło