มีฟังก์ชั่น Drupal API เพื่อรับรายการโหนดตามประเภทหรือไม่?


35

มีฟังก์ชั่น Drupal API เช่นnode_load()นั้นจะส่งกลับรายการของโหนดตามประเภทที่กำหนดหรือไม่?

ฉันพยายาม$nodes = node_load(array("type" => 'student_vote'))แล้ว แต่จะคืนค่าเพียงหนึ่งโหนดเท่านั้น

ฉันรู้ว่าฉันสามารถเขียนโค้ดบางอย่างเช่นnode_load()แต่ฉันต้องการที่จะดูว่าอาจมีอะไรแบบนั้นออกมาแล้ว

คำตอบ:


45

ขึ้นอยู่กับรุ่นของ Drupal:

drupal 6:

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

7 drupal:

$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
จำไว้ว่า $ เงื่อนไขอาร์เรย์คิดค่าเสื่อมราคาและจะถูกลบออกใน 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
Elijah Lynn

13

ไม่มี API ดังกล่าวสำหรับ Drupal 6 สิ่งที่ใกล้เคียงที่สุดที่คุณสามารถทำได้คือการค้นหาอย่างถูกต้องสำหรับ 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 ของโหนดจากนั้นใช้node_load_multiple()แต่ไม่มี$conditionอาร์กิวเมนต์ s

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']));
}

ที่จริงแล้วถ้าคุณทำ node_load () ใน D6 ดังนี้: node_load (array ('type' => 'page')) คุณจะได้รับอาร์เรย์ทั้งหมดของโหนดหน้าทั้งหมด
เบลค Senftner

@bsenftner node_load (array ('type' => 'page')) จะคืนค่าหนึ่งโหนดเท่านั้น
ฉิ่ม

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

ฉันคิดว่าฉันไม่จำเป็นต้องอ้างถึงเวอร์ชันเก่าที่มีข้อโต้แย้งที่เลิกใช้เพราะฉันเพิ่งใช้เอนทิตีโหลดทันที วิธีนี้มีความเสี่ยง "ไม่" ของผู้คนโดยไม่ได้ตั้งใจโดยใช้ฟังก์ชั่นที่เลิกใช้แล้ว หรือคุณไม่เห็นด้วยกับสิ่งนั้น?
Letharion

1
คุณหมายถึงarray_keys($results[$entity_type])อะไร
commonpike

@commonpike มีแนวโน้มมากที่สุดใช่ ฉันไม่มีโอกาสตรวจสอบในขณะนี้ แต่รู้สึกอิสระที่จะแก้ไขและแก้ไขหากคุณทดสอบ :)
Letharion

entity_load($entity_type, array_keys($results['node']));ผมทำสิ่งที่แตกต่างออกไปเล็กน้อยและจำเป็นต้องระบุ Havent ทดสอบสำหรับเอนทิตีอื่น ๆ ..
commonpike


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.