Usando funções SQL em condicionais no Drupal 7 db_select ()

9

Estou tentando escrever uma condição em uma cláusula SQL WHERE que força a comparação da coluna a uma variável a ser comparada em minúsculas. No entanto, a função addExpression não está realizando isso (pois isso está colocando a expressão na seleção de campo, não na cláusula where.

Aqui está o que eu tentei:

$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 isto:

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

O segundo se torna inválido e o primeiro causa o problema mencionado acima. Quaisquer pensamentos ou sugestões?

Obrigado Patrick

Patrick
fonte

Respostas:

15

mudança

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

para

$query->where('LOWER(ttd.name) = :category', array(':category' => $category));
xandeadx
fonte
Isso funciona. Nem me ocorreu fazer isso.
1011 Patrick
3

O uso LOWER()é considerado lento no MySQL. Também não é necessário porque LIKEna API do banco de dados do Drupal (DBTNG) não diferencia maiúsculas de minúsculas, pelo menos quando sua tabela MySQL está configurada para usar um dos agrupamentos * _ci. Uma instalação padrão do MySQL usa * utf8_general_ci * e o Drupal também.

Então, você só precisa usar uma condição LIKE:

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

Veja Cláusulas Condicionais para uma explicação abrangente.

BTW: Um driver de banco de dados baseado em DBTNG é responsável por implementar um LIKE que não diferencia maiúsculas de minúsculas. O PostgreSQL, por exemplo, usa ILIKE em vez de LIKE, que é tratado em includes / database / pgsql / database.inc .

Bernhard Fürst
fonte
1

Você ainda pode usar o addExpression.

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

Recurso: exemplos de consulta SQL no Drupal 7

ram4nd
fonte