web-dev-qa-db-fra.com

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

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

9
Patrick

changement

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

à

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

L'utilisation de LOWER() est considérée comme lente dans MySQL. Ce n'est pas nécessaire non plus car LIKE dans l'API Database de Drupal (DBTNG) ne respecte pas la casse, du 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 comprend/database/pgsql/database.inc .

3
Bernhard Fürst

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

1
ram4nd