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
Używanie
LOWER()
jest uważane za wolne w MySQL. Nie jest to również konieczne, ponieważLIKE
w 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:
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 .
źródło
Nadal możesz używać addExpression.
Zasób: Przykłady zapytań SQL w Drupal 7
źródło