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 SelectQueryInterfacecomme 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 $operatorest é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 conditionest 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'?