En el ejemplo específico, simplemente debe escribir la condición como:
$query->condition('n.language', 'ab', '<>');
En el caso genérico, donde necesita seleccionar las filas en una base de datos basándose en los valores devueltos por una subconsulta, debe considerar lo siguiente:
"NOT IN" se acepta como operador de SelectQuery::condition()
. De hecho, se ejecutaría la siguiente consulta:
$query = db_select('node', 'n')->fields('n');
$query->condition('n.nid', array(1, 2, 3), 'NOT IN');
$nodes = $query->execute();
foreach ($nodes as $node) {
dsm($node->nid);
}
Como se informa en las cláusulas condicionales ("Subselecciones"), SelectQuery::condition()
acepta también un objeto que se implementa SelectQueryInterface
como valor para $value
, como el devuelto por db_select()
; el problema es que en realidad puedes usarlo cuando el valor de $operator
es igual a "IN"
. Consulte las Subselecciones no funcionan en condiciones DBTNG, excepto cuando se usan como valor para IN .
La única forma en que puedo ver el uso del operador "NO EN" con una subconsulta condition
es:
- Ejecute la subconsulta para obtener una matriz
Ejecute la consulta principal estableciendo la condición como en el siguiente fragmento
$query->condition($key, $subquery_result, 'NOT IN');
$subquery_result
es la matriz que contiene el resultado de la subconsulta.
De lo contrario, podría usar where()
como otros dijeron, lo que acepta una cadena para la parte de la consulta que necesita agregar.
Tenga en cuenta que db_select()
es más lento eso db_query()
; debe usar el primero cuando sepa que la consulta podría ser alterada por otros módulos. De lo contrario, si se supone que otros módulos no deben usarse hook_query_alter()
para alterar su consulta, debe usarlos db_query()
.
En el caso de acceder a los nodos, si necesita obtener solo los nodos a los que tiene acceso un usuario, debe usar db_select()
y agregar 'node_access'
como etiqueta de la consulta, con SelectQuery::addTag()
. Por ejemplo, blog_page_last()
usa el siguiente código.
$query = db_select('node', 'n')->extend('PagerDefault');
$nids = $query
->fields('n', array('nid', 'sticky', 'created'))
->condition('type', 'blog')
->condition('status', 1)
->orderBy('sticky', 'DESC')
->orderBy('created', 'DESC')
->limit(variable_get('default_nodes_main', 10))
->addTag('node_access')
->execute()
->fetchCol();
Código similar es utilizado por book_block_view()
.
$select = db_select('node', 'n')
->fields('n', array('title'))
->condition('n.nid', $node->book['bid'])
->addTag('node_access');
$title = $select->execute()->fetchField();
SELECT nid FROM node WHERE language != 'ab'
?