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
L'utilisation
LOWER()
est considérée comme lente dans MySQL. Ce n'est pas nécessaire non plus carLIKE
dans 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:
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 .
la source
Vous pouvez toujours utiliser addExpression.
Ressource: exemples de requêtes SQL dans Drupal 7
la source