特定のコンテンツタイプのすべてのノードのフィールドから一部の情報を回復したい。 db_query
を使用してすべてのノードIDを取得し、それらを反復処理する方法を知っています。私が知りたいのは、drupal関数を使用してこれを回避する別の方法があるかどうかです。
node_load_multiple()
を介してその情報を直接クエリできます
$nodes = node_load_multiple(array(), array('type' => 'my_type'));
$conditions
配列(2番目の引数)に必要なだけプロパティ条件を追加できるため、ステータス、作成済みなども公平なゲームです。
$conditions
は技術的には非推奨ですが(EntityFieldQuery
を支持することを想像します)、Drupal 7からその機能が削除される可能性は基本的にありません。これも壊れます。たくさん。
Drupalコアは EntityFieldQuery()
というクラスを提供します。それを使用するための 便利なドキュメントページ もあり、多くの例があります。最も単純な形で:
$query = new EntityFieldQuery();
$query->entityCondition('entity_type', 'node')
->entityCondition('bundle', 'page')
->propertyCondition('status', 1);
$result = $query->execute();
if (!empty($result['node'])) {
$nids = array_keys($result['node']);
$nodes = node_load_multiple($nids);
foreach ($nodes as $node) {
// do something awesome
}
}
これにより、「ページ」タイプのすべての公開されたノードがロードされます。これを定期的に調整する必要があります
$query = new EntityFieldQuery();
$query->entityCondition('entity_type', 'node')
->entityCondition('bundle', 'page')
->propertyCondition('status', 1);
$result = $query->execute();
if (!empty($result['node'])) {
$nids = array_keys($result['node']);
foreach ($nids as $nid) {
$node = node_load($nid, NULL, TRUE);
// do something awesome
}
}
メモリの問題を引き起こす可能性のある、一度にロードしすぎないようにします。