是否有Drupal API函数可按类型获取节点列表?


35

是否有像node_load()这样的Drupal API函数会返回给定类型的节点列表?

我试过了$nodes = node_load(array("type" => 'student_vote')),但是它只返回一个节点。

我知道我可以编写类似的代码node_load(),但是我想看看是否已经有类似的代码了。

Answers:


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);

是的,这行得通。
Muneer

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()是没有更多的在Drupal 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,然后使用node_load_multiple()但不带$conditions参数的节点ID 。

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'))仅返回一个节点。
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 2015年

@commonpike最有可能的是。我目前没有机会进行检查,但是如果您进行测试,可以随时进行编辑和更正。:)
Letharion

我做的事情有些不同,需要指定entity_load($entity_type, array_keys($results['node']));。还没有测试它的其他实体..
commonpike

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);

希望这会有所帮助。


您的答案与上述答案有什么不同?完全一样。
ЕлинЙ.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.