W konkretnym przykładzie powinieneś po prostu napisać warunek jako:
$query->condition('n.language', 'ab', '<>');
W ogólnym przypadku, w którym należy wybrać wiersze w bazie danych na podstawie wartości zwróconych z zapytania częściowego, należy rozważyć następujące kwestie:
„NOT IN” jest akceptowane jako operator od SelectQuery::condition()
. W rzeczywistości zostanie wykonane następujące zapytanie:
$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);
}
Jak podano w klauzulach warunkowych („Subselects”), SelectQuery::condition()
akceptuje również obiekt implementujący SelectQueryInterface
jako wartość $value
, taki jak ten zwracany przez db_select()
; problem polega na tym, że właściwie można go użyć, gdy wartość $operator
jest równa "IN"
. Zobacz: Podselekty nie działają w warunkach DBTNG, z wyjątkiem przypadków użycia jako wartości IN .
Jedyny sposób, w jaki widzę użycie operatora „NOT IN” w zapytaniu podrzędnym condition
to:
- Wykonaj podzapytanie, aby uzyskać tablicę
Wykonaj główne zapytanie, ustawiając warunek jak w poniższym fragmencie
$query->condition($key, $subquery_result, 'NOT IN');
$subquery_result
to tablica zawierająca wynik zapytania podrzędnego.
W przeciwnym razie możesz użyć, where()
jak powiedzieli inni, który akceptuje ciąg dla części zapytania, którą musisz dodać.
Pamiętaj, że db_select()
jest to wolniejsze db_query()
; powinieneś użyć pierwszego, gdy wiesz, że zapytanie może zostać zmienione przez inne moduły. W przeciwnym razie, jeśli inne moduły nie powinny używać hook_query_alter()
do zmiany zapytania, należy użyć db_query()
.
W przypadku uzyskiwania dostępu do węzłów, jeśli potrzebujesz uzyskać tylko te węzły, do których użytkownik ma dostęp, musisz użyć db_select()
i dodać 'node_access'
jako znacznik zapytania za pomocą SelectQuery::addTag()
. Na przykład blog_page_last()
używa następującego kodu.
$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();
Podobny kod jest używany przez 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'
?