Dans l'exemple spécifique, vous devez simplement écrire la condition comme suit:
$query->condition('n.language', 'ab', '<>');
Dans le cas générique, où vous devez sélectionner les lignes d'une base de données en fonction des valeurs renvoyées par une sous-requête, vous devez considérer ce qui suit:
"NOT IN" est accepté comme opérateur à partir de SelectQuery::condition()
. En fait, la requête suivante serait exécutée:
$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);
}
Comme indiqué dans les clauses conditionnelles ("Sous-sélections"), SelectQuery::condition()
accepte également un objet implémentant SelectQueryInterface
comme valeur pour $value
, tel que celui renvoyé par db_select()
; le problème est qu'en fait, vous pouvez simplement l'utiliser lorsque la valeur de $operator
est égale à "IN"
. Voir Les sous-sélections ne fonctionnent pas dans des conditions DBTNG, sauf lorsqu'elles sont utilisées comme valeur pour IN .
La seule façon que je peux voir d'utiliser l'opérateur "NOT IN" avec une sous-requête dans condition
est de:
- Exécutez la sous-requête pour obtenir un tableau
Exécutez la requête principale en définissant la condition comme dans l'extrait de code suivant
$query->condition($key, $subquery_result, 'NOT IN');
$subquery_result
est le tableau contenant le résultat de la sous-requête.
Sinon, vous pourriez utiliser where()
comme d'autres l'ont dit, qui accepte une chaîne pour la partie de la requête que vous devez ajouter.
Gardez à l'esprit que db_select()
c'est plus lent que cela db_query()
; vous devez utiliser le premier lorsque vous savez que la requête peut être modifiée par d'autres modules. Sinon, si d'autres modules ne sont pas censés utiliser hook_query_alter()
pour modifier votre requête, vous devez utiliser db_query()
.
Dans le cas de l'accès aux nœuds, si vous devez obtenir uniquement les nœuds auxquels un utilisateur a accès, vous devez utiliser db_select()
et ajouter 'node_access'
comme balise de la requête, avec SelectQuery::addTag()
. Par exemple, blog_page_last()
utilise le code suivant.
$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();
Un code similaire est utilisé par 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'
?