Uso de funciones SQL en condicionales en Drupal 7 db_select ()


9

Estoy tratando de escribir una condición en una cláusula WHERE de SQL que obliga a la comparación de columnas a una variable a compararse en minúsculas. Sin embargo, la función addExpression no está logrando esto (ya que eso está poniendo la expresión en la selección del campo, no la cláusula where.

Esto es lo que he intentado:

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

Y esto:

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

El segundo deja de ser válido y el primero causa el problema que mencioné anteriormente. ¿Alguna idea o sugerencia?

Gracias patricio

Respuestas:


15

cambio

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

a

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

Eso funciona. Ni siquiera se me ocurrió hacer eso.
Patrick

3

El uso LOWER()se considera lento en MySQL. Tampoco es necesario porque LIKEen la base de datos de Drupal, la API (DBTNG) no distingue entre mayúsculas y minúsculas, al menos cuando su tabla MySQL está configurada para usar una de las intercalaciones * _ci. Una instalación estándar de MySQL usa * utf8_general_ci * y también lo es Drupal.

Entonces solo necesita usar una condición LIKE:

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

Ver Cláusulas condicionales para una explicación completa.

Por cierto: un controlador de base de datos basado en DBTNG es responsable de implementar un LIKE sin distinción entre mayúsculas y minúsculas. PostgreSQL, por ejemplo, usa ILIKE en lugar de LIKE, que se maneja en include / database / pgsql / database.inc .


1

Todavía puede usar addExpression.

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

Recurso: ejemplos de consultas SQL en Drupal 7

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.