Nell'esempio specifico, devi semplicemente scrivere la condizione come:
$query->condition('n.language', 'ab', '<>');
Nel caso generico, in cui è necessario selezionare le righe in un database in base ai valori restituiti da una query secondaria, è necessario considerare quanto segue:
"NOT IN" è accettato come operatore da SelectQuery::condition()
. In effetti, verrebbe eseguita la seguente query:
$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);
}
Come riportato nelle clausole condizionali ("Sottoselezioni"), SelectQuery::condition()
accetta anche un oggetto implementato SelectQueryInterface
come valore per $value
, come quello restituito da db_select()
; il problema è che in realtà puoi semplicemente usarlo quando il valore di $operator
è uguale a "IN"
. Vedi Sottoselezioni non funzionano in condizioni DBTNG, tranne quando usato come valore per IN .
L'unico modo in cui riesco a vedere l'operatore "NOT IN" con una query secondaria in condition
è di:
- Eseguire la subquery per ottenere un array
Esegui la query principale impostando la condizione come nel frammento seguente
$query->condition($key, $subquery_result, 'NOT IN');
$subquery_result
è l'array che contiene il risultato della query secondaria.
Altrimenti, potresti usare where()
come altri hanno detto, che accetta una stringa per la parte della query che devi aggiungere.
Tieni presente che db_select()
è più lento db_query()
; dovresti usare il primo quando sai che la query potrebbe essere modificata da altri moduli. Altrimenti, se non si prevede che altri moduli utilizzino hook_query_alter()
per modificare la query, è necessario utilizzare db_query()
.
Nel caso di accesso a nodi, se è necessario ottenere solo i nodi a cui un utente ha accesso, è necessario utilizzare db_select()
e aggiungere 'node_access'
come tag della query, con SelectQuery::addTag()
. Ad esempio, blog_page_last()
utilizza il seguente codice.
$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();
Codice simile è utilizzato da 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'
?