タイプ別にノードのリストを取得するDrupal API関数はありますか?


35

node_load()特定のタイプのノードのリストを返すようなDrupal API関数はありますか?

試しましたが$nodes = node_load(array("type" => 'student_vote'))、1つのノードのみを返します。

のようなコードを作成できることは知っていますがnode_load()、そのようなものがすでにあるかどうかを確認したかったのです。

回答:


45

Drupalのバージョンに応じて:

drupal 6:

$nodes = db_query('SELECT nid FROM {node} WHERE type="%s"', $type);

drupal 7:

$nodes = node_load_multiple(array(), array('type' => $type));

drupal 8:

$nids = \Drupal::entityQuery('node')
  ->condition('type', 'NODETYPE')
  ->execute();
$nodes = \Drupal::entityTypeManager()
  ->getStorage('node')
  ->loadMultiple($nids);

はい、これは動作します。
ミューナー

6
$ conditions配列は減価されており、将来の互換性のためにEntityFieldQuery(api.drupal.org/api/drupal/includes%21entity.inc/class/…)を使用することをお勧めします。ノードIDを取得し、それらをnode_load_multiple()の最初の引数に渡します。ここには良いチュートリアルがあります:drupal.org/node/1343708
Bala Clark

1
ただ、明確にするため、EntityFieldQueryは()これ以上のDrupal 8ではありません
イライジャ・リン

13

Drupal 6にはそのようなAPIはありません。最も近い方法は、コンテンツタイプのすべてのノードIDを適切にクエリし、node_load()を使用してそれぞれをロードすることですが、これにはn + 1クエリが必要で、あまり効率的ではありません。

function node_load_by_type($type, $limit = 15, $offset = 0) {
  $nodes = array();
  $query = db_rewrite_sql("SELECT nid FROM {node} n WHERE type = '%s'", 'n');
  $results = db_query_range($query, $type, $offset, $limit);
  while($nid = db_result($results)) {
    $nodes[] = node_load($nid);
  }
  return $nodes;
}

注:db_rewrite_sqlアクセスチェックと他のモジュールが提供するフィルタリング(i18nモジュールが提供する言語フィルタリングなど)を確実にします。

Drupal 7では、使用できます$nodes = node_load_multiple(array(), array('type' => $type));が、の$conditions引数node_load_multiple()は非推奨です。代わりに、EntityFieldQueryを使用してノードIDを照会し、s引数node_load_multiple()なしで使用する必要があり$conditionます。

function node_load_by_type($type, $limit = 15, $offset = 0) {
  $query = new EntityFieldQuery();
  $query->entityCondition('entity_type', 'node')
    ->entityCondition('bundle', $type)
    ->range($offset, $limit);
  $results = $query->execute();
  return node_load_multiple(array_keys($results['node']));
}

実際、次のようにD6でnode_load()を実行すると、node_load(array( 'type' => 'page'))すべてのページノードのすべての配列が取得されます。
ブレイクセンフトナー

@bsenftner node_load(array( 'type' => 'page'))は、1つのノードのみを返します。
チム

7

すでにいくつかの良い答えがありますが、それらは文字通り質問を受け取り、ノードのみを参照します。

D6には、要求されていることを実行するためのAPIがなく、D7以降のノードに自分自身を制限する必要がないため、適切な答えはエンティティジェネリックである必要があります。

function entity_load_by_type($entity_type, $bundle, $limit = 10, $offset = 0) {
  $query = new EntityFieldQuery();
  $query->entityCondition('entity_type', $entity_type)
    ->entityCondition('bundle', $bundle)
    ->range($offset, $limit);
  $results = $query->execute();
  return entity_load($entity_type, array_keys($results[$]));
}

についての回答を追加するつもりでしたEntityFieldQueryが、あなたはすでにあなたのものを書いています。の2番目の引数はuser_load_multiple()Drupal 7から非推奨になり、使用されたコードは表示されているはずです。
kiamlaluno

entity_loadをすぐに使用したため、古いバージョンを非推奨の引数で参照する必要さえないと考えました。そうすれば、非推奨の機能を誤って使用してしまうという「リスク」はありません。それともあなたはそれに反対しますか?
レサリオン

1
という意味array_keys($results[$entity_type])ですか?
commonpike

@commonpikeほとんどの場合、はい。現時点では確認する機会はありませんが、テストしてみてください。:)
レサリオン

私は少し違ったことをしていて、指定する必要があったentity_load($entity_type, array_keys($results['node']));。Haventは他のエンティティに対してテストしました。
commonpike15年

1

drupal 8:

$nids = \Drupal::entityQuery('node')
  ->condition('type', 'student_vote')
  ->execute();
$nodes = \Drupal::entityTypeManager()
  ->getStorage('node')
  ->loadMultiple($nids);

1

コンテンツタイプからノードのリストを取得する

Drupal 6:

$nodes = db_query('SELECT nid FROM {node} WHERE type="%s"', 'student_vote');

Drupal 7:

$nodes = node_load_multiple(array(), array('type' => 'student_vote'));

Drupal 8:

$nids = \Drupal::entityQuery('node')
  ->condition('type', 'student_vote')
  ->execute();
$nodes = \Drupal::entityTypeManager()
  ->getStorage('node')
  ->loadMultiple($nids);

これが役立つことを願っています。


上記の答えとあなたの答えの違いは何ですか?まったく同じです。
ЕлинЙ.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.