No exemplo específico, você deve simplesmente escrever a condição como:
$query->condition('n.language', 'ab', '<>');
No caso genérico, em que você precisa selecionar as linhas em um banco de dados com base nos valores retornados de uma subconsulta, considere o seguinte:
"NOT IN" é aceito como operador de SelectQuery::condition()
. De fato, a seguinte consulta seria executada:
$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);
}
Conforme relatado nas cláusulas condicionais ("Subseleciona"), SelectQuery::condition()
também aceita um objeto implementado SelectQueryInterface
como valor para $value
, como o retornado por db_select()
; o problema é que, na verdade, você pode usá-lo apenas quando o valor de $operator
for igual a "IN"
. Consulte Subselecionamentos não funcionam em condições DBTNG, exceto quando usado como valor para IN .
A única maneira de ver o uso do operador "NOT IN" com uma subconsulta condition
é:
- Execute a subconsulta para obter uma matriz
Execute a consulta principal definindo a condição como no seguinte trecho
$query->condition($key, $subquery_result, 'NOT IN');
$subquery_result
é a matriz que contém o resultado da subconsulta.
Caso contrário, você pode usar where()
como outros disseram, que aceita uma string para a parte da consulta que você precisa adicionar.
Tenha em mente que db_select()
é mais lento isso db_query()
; você deve usar o primeiro quando souber que a consulta pode ser alterada por outros módulos. Caso contrário, se outros módulos não devem ser usados hook_query_alter()
para alterar sua consulta, você deve usá-lo db_query()
.
No caso de acessar nós, se você precisar obter apenas os nós aos quais um usuário tem acesso, precisará usar db_select()
e adicionar 'node_access'
como tag da consulta, com SelectQuery::addTag()
. Por exemplo, blog_page_last()
usa o seguinte 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 semelhante é usado 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'
?