Utilizzo delle funzioni SQL nei condizionali in Drupal 7 db_select ()


9

Sto cercando di scrivere una condizione in una clausola WHERE di SQL che impone il confronto delle colonne in una variabile da confrontare in minuscolo. Tuttavia, la funzione addExpression non sta realizzando ciò (dal momento che inserisce l'espressione nella selezione del campo, non nella clausola where.

Ecco cosa ho provato:

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

E questo:

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

Il secondo diventa non valido e il primo causa il problema che ho menzionato sopra. Qualche idea o suggerimento?

Grazie Patrick

Risposte:


15

modificare

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

per

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

Che funzioni. Non mi è nemmeno venuto in mente di farlo.
Patrick,

3

L'uso LOWER()è considerato lento in MySQL. Non è necessario anche perché LIKEnell'API Database di Drupal (DBTNG) non fa distinzione tra maiuscole e minuscole, almeno quando la tabella MySQL è configurata per utilizzare una delle regole di confronto * _ci. Un'installazione standard di MySQL utilizza * utf8_general_ci *, così come Drupal.

Quindi devi solo usare una condizione LIKE:

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

Vedere le clausole condizionali per una spiegazione esauriente.

A proposito: un driver di database basato su DBTNG è responsabile dell'implementazione di un LIKE senza distinzione tra maiuscole e minuscole. PostgreSQL ad esempio usa ILIKE invece di LIKE che è gestito in include / database / pgsql / database.inc .


1

Puoi ancora usare addExpression.

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

Risorsa: esempi di query SQL in Drupal 7

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.