Febrero 13, 2014
enzo
Hoy vengo a compartirles algo básico en consulta de bases de datos como lo son los Sub selects; Si bien es cierto por la forma en que esta hecha Drupal este tipo de consultas en modulos personalizados son muy extrañas, no dejan de ser necesarias.
Imaginemos que queremos una consulta que nos retorne todos los nodos excepto aquellos que pertenecen a un usuario especifico, a continuación una solución al respecto.
$subquery = db_select('node', 'n2')
->fields('n2', array('nid'))
->join('users', 'u', 'n2.uid = u.uid'
->condition('u.uid', 7);
$query = db_select('node', 'n')
->fields('n', array('nid'));
$query->condition('n.nid', $subquery, 'NOT IN');
$result = $query->execute();
Como se puede apreciar se crea un subquery con un alias a la tabla nodo n2 para determinar los nodos cuyo autor es el usuario con UID #7, pero este consulta no se ejecuta, pero se utiliza en el siguiente query.
Posteriormente se crear otra consulta sobre la misma tabla nodo pero con el alias n para evitar confusiones, la magia ocurre que en la condición NOT IN en lugar de enviar una arreglo de nids, se envía el objeto subquery y PDO lo procesara como un subquery.
Otra opción disponible es usar la función where de PDO como se muestra a continuación.
$query->where('n.nid NOT IN(select nid from {nodes} where uid = :uid)',
array(':uid' => 7));
Espero que haya sido de su agrado.