Im konkreten Beispiel schreiben Sie die Bedingung einfach wie folgt:
$query->condition('n.language', 'ab', '<>');
Im allgemeinen Fall, in dem Sie die Zeilen in einer Datenbank basierend auf den von einer Unterabfrage zurückgegebenen Werten auswählen müssen, sollten Sie Folgendes berücksichtigen:
"NOT IN" wird als Operator von akzeptiert SelectQuery::condition()
. Tatsächlich würde die folgende Abfrage ausgeführt:
$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);
}
Akzeptiert , wie in den Bedingungsklauseln ("Unterauswahlen") angegeben, SelectQuery::condition()
auch ein Objekt, das SelectQueryInterface
als Wert für implementiert ist $value
, z. B. das von zurückgegebene Objekt db_select()
. Das Problem ist, dass Sie es tatsächlich nur verwenden können, wenn der Wert von $operator
gleich ist "IN"
. Siehe Unterauswahlen funktionieren nicht unter DBTNG-Bedingungen, außer wenn sie als Wert für IN verwendet werden .
Die einzige Möglichkeit, den Operator "NOT IN" mit einer Unterabfrage in zu verwenden, condition
besteht darin,
- Führen Sie die Unterabfrage aus, um ein Array abzurufen
Führen Sie die Hauptabfrage aus, indem Sie die Bedingung wie im folgenden Snippet festlegen
$query->condition($key, $subquery_result, 'NOT IN');
$subquery_result
ist das Array, das das Ergebnis der Unterabfrage enthält.
Andernfalls könnten Sie, where()
wie bereits erwähnt, eine Zeichenfolge für den Teil der Abfrage verwenden, den Sie hinzufügen müssen.
Denken Sie daran, dass db_select()
das langsamer ist db_query()
; Sie sollten die erste verwenden, wenn Sie wissen, dass die Abfrage von anderen Modulen geändert werden kann. Andernfalls sollten Sie verwenden, wenn andere Module nicht hook_query_alter()
zum Ändern Ihrer Abfrage verwendet werden sollen db_query()
.
Wenn Sie beim Zugriff auf Knoten nur die Knoten abrufen müssen, auf die ein Benutzer Zugriff hat, müssen Sie mit als Tag der Abfrage verwenden db_select()
und hinzufügen . Zum Beispiel verwendet den folgenden Code.'node_access'
SelectQuery::addTag()
blog_page_last()
$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();
Ein ähnlicher Code wird von verwendet 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'
?