Verwenden von SQL-Funktionen in Bedingungen in Drupal 7 db_select ()

9

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

Patrick
quelle

Antworten:

15

Veränderung

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

zu

$query->where('LOWER(ttd.name) = :category', array(':category' => $category));
xandeadx
quelle
Das funktioniert. Es ist mir nicht einmal in den Sinn gekommen, das zu tun.
Patrick
3

Die Verwendung LOWER()wird in MySQL als langsam angesehen. LIKEDies 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:

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

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 .

Bernhard Fürst
quelle
1

Sie können addExpression weiterhin verwenden.

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

Ressource: Beispiele für SQL-Abfragen in Drupal 7

ram4nd
quelle