유형별로 노드 목록을 가져 오는 Drupal API 함수가 있습니까?


35

node_load()주어진 유형에 따라 노드 목록을 반환 하는 Drupal API 함수 가 있습니까?

시도 $nodes = node_load(array("type" => 'student_vote'))했지만 하나의 노드 만 반환합니다.

나는와 같은 것을 코딩 할 node_load()수 있다는 것을 알고 있지만 이미 그런 것이 있는지 알고 싶었다.

답변:


45

Drupal 버전에 따라 :

드루팔 6 :

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

드루팔 7 :

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

드루팔 8 :

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

그렇습니다.
Muneer 2016 년

6
$ conditions 배열은 감가 상각되며 Drupal 8에서 제거 될 예정입니다. 향후 호환성을 위해 EntityFieldQuery ( api.drupal.org/api/drupal/includes%21entity.inc/class/… )를 사용하는 것이 좋습니다. 노드 ID를 얻은 다음 node_load_multiple ()의 첫 번째 인수로 전달하십시오. 여기에 좋은 튜토리얼이 있습니다 : drupal.org/node/1343708
Bala Clark

1
그냥 명확하게하기 위해, EntityFieldQuery ()는 더 이상 드루팔 8에서입니다
엘리야 린

13

Drupal 6에는 이러한 API가 없습니다. 가장 가까운 방법은 컨텐츠 유형에 대한 모든 노드 ID를 올바르게 쿼리 한 다음 node_load ()를 사용하여 각 노드 ID를로드하는 것입니다. 그러나 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')) 모든 페이지 노드의 모든 배열을 얻을 수 있습니다.
Blake Senftner

@bsenftner node_load (array ( 'type'=> 'page'))는 하나의 노드 만 반환합니다.
chim

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했지만 이미 작성했습니다. user_load_multiple()Drupal 7 이후 두 번째 인수는 더 이상 사용되지 않으며 사용 된 코드는 표시해야한다고 덧붙였습니다.
kiamlaluno

방금 entity_load를 사용했기 때문에 더 이상 사용되지 않는 인수로 이전 버전을 참조 할 필요조차 없다고 생각했습니다. 그렇게하면 사람들이 더 이상 사용되지 않는 기능을 사용하여 실수로 끝날 위험이 없습니다. 아니면 동의하지 않습니까?
Letharion

1
당신은 의미 array_keys($results[$entity_type])했습니까?
commonpike

@commonpike 아마 그렇습니다. 현재로서는 확인할 기회가 없지만 테스트를 해보면 자유롭게 수정하고 수정할 수 있습니다. :)
Letharion

나는 약간 다른 것을하고 있었고 지정해야했습니다 entity_load($entity_type, array_keys($results['node']));. Havent는 다른 실체에 대해서도이를 테스트했습니다.
commonpike

1

드루팔 8 :

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

1

컨텐츠 유형에서 노드 목록 가져 오기

드루팔 6 :

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

드루팔 7 :

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

드루팔 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.