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
El uso
LOWER()
se considera lento en MySQL. Tampoco es necesario porqueLIKE
en 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:
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 .
fuente
Todavía puede usar addExpression.
Recurso: ejemplos de consultas SQL en Drupal 7
fuente