Ich versuche, eine Bedingung in eine SQL WHERE-Klausel zu schreiben, die den Spaltenvergleich mit einer Variablen erzwingt, die in Kleinbuchstaben verglichen werden soll. Die Funktion addExpression führt dies jedoch nicht aus (da dadurch der Ausdruck in die Feldauswahl und nicht in die where-Klausel eingefügt wird.
Folgendes habe ich versucht:
$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();
Und das:
$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();
Der zweite wird ungültig und der erste verursacht das oben erwähnte Problem. Irgendwelche Gedanken oder Vorschläge?
Danke, Patrick
Die Verwendung
LOWER()
wird in MySQL als langsam angesehen.LIKE
Dies ist auch nicht erforderlich, da in der Datenbank-API (DBTNG) von Drupal die Groß- und Kleinschreibung nicht berücksichtigt wird, zumindest wenn Ihre MySQL-Tabelle für die Verwendung einer der * _ci-Kollatierungen konfiguriert ist. Eine Standard-MySQL-Installation verwendet * utf8_general_ci * und Drupal auch.Sie müssen also nur eine LIKE-Bedingung verwenden:
Eine umfassende Erläuterung finden Sie unter Bedingungsklauseln .
Übrigens: Ein DBTNG-basierter Datenbanktreiber ist für die Implementierung eines LIKE ohne Berücksichtigung der Groß- und Kleinschreibung verantwortlich. PostgreSQL verwendet beispielsweise ILIKE anstelle von LIKE, das in include / database / pgsql / database.inc behandelt wird .
quelle
Sie können addExpression weiterhin verwenden.
Ressource: Beispiele für SQL-Abfragen in Drupal 7
quelle