it-swarm.com.de

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

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

9
Patrick

veränderung

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

zu

$query->where('LOWER(ttd.name) = :category', array(':category' => $category));
15
xandeadx

Die Verwendung von LOWER() wird in MySQL als langsam angesehen. Dies ist auch nicht erforderlich, da LIKE in der Datenbank-API (DBTNG) von Drupal die Groß- und Kleinschreibung nicht berücksichtigt, 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 Erklärung finden Sie unter Bedingte Klauseln .

Ü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.

3
Bernhard Fürst

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: SQL-Abfragebeispiele in Drupal 7

1
ram4nd