特定の例では、条件を次のように単純に記述する必要があります。
$query->condition('n.language', 'ab', '<>');
サブクエリから返された値に基づいてデータベース内の行を選択する必要がある一般的な場合、次のことを考慮する必要があります。
「NOT IN」はから演算子として受け入れられSelectQuery::condition()
ます。実際、次のクエリが実行されます。
$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);
}
条件節(「副選択」)で報告されているように、によって返されるSelectQuery::condition()
オブジェクトなど、のSelectQueryInterface
値として実装するオブジェクトも受け入れます。問題は、の値がに等しいときに実際に使用できることです。INの値として使用する場合を除き、DBTNG条件では副選択が機能しないを参照してください。$value
db_select()
$operator
"IN"
サブクエリで「NOT IN」演算子を使用する唯一の方法condition
は、次のとおりです。
- サブクエリを実行して配列を取得します
次のスニペットのように条件を設定してメインクエリを実行します
$query->condition($key, $subquery_result, 'NOT IN');
$subquery_result
サブクエリの結果を含む配列です。
それ以外の場合は、where()
他の人が言ったように、追加する必要のあるクエリの一部の文字列を受け入れるように使用できます。
それdb_select()
が遅いことを覚えておいてくださいdb_query()
。クエリが他のモジュールによって変更される可能性があることがわかっている場合は、最初のものを使用する必要があります。それ以外の場合、hook_query_alter()
クエリを変更するために他のモジュールを使用することになっていない場合は、を使用する必要がありますdb_query()
。
ノードにアクセスする場合、ユーザーがアクセスできるノードのみを取得する必要がある場合は、クエリのタグとしてを使用db_select()
して追加する必要'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();
同様のコードがで使用されてい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'
ですか?