Utilisation des fonctions SQL dans les conditions dans Drupal 7 db_select ()

9

J'essaie d'écrire une condition dans une clause SQL WHERE qui force la comparaison de colonnes à une variable à comparer en minuscules. Cependant, la fonction addExpression n'accomplit pas cela (car cela place l'expression dans la sélection de champ, pas la clause where.

Voici ce que j'ai essayé:

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

Et ça:

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

Le second devient invalide et le premier provoque le problème que j'ai mentionné ci-dessus. Des pensées ou des suggestions?

Merci, Patrick

Patrick
la source

Réponses:

15

changement

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

à

$query->where('LOWER(ttd.name) = :category', array(':category' => $category));
xandeadx
la source
Ça marche. Cela ne m'est même pas venu à l'esprit.
Patrick
3

L'utilisation LOWER()est considérée comme lente dans MySQL. Ce n'est pas nécessaire non plus car LIKEdans l'API Database de Drupal (DBTNG), la casse est insensible, au moins lorsque votre table MySQL est configurée pour utiliser l'un des classements * _ci. Une installation MySQL standard utilise * utf8_general_ci * et Drupal aussi.

Il vous suffit donc d'utiliser une condition LIKE:

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

Voir Clauses conditionnelles pour une explication complète.

BTW: Un pilote de base de données basé sur DBTNG est responsable de l'implémentation d'un LIKE insensible à la casse. PostgreSQL, par exemple, utilise ILIKE au lieu de LIKE qui est géré dans includes / database / pgsql / database.inc .

Bernhard Fürst
la source
1

Vous pouvez toujours utiliser addExpression.

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

Ressource: exemples de requêtes SQL dans Drupal 7

ram4nd
la source