วิธีการวนซ้ำโหนดทั้งหมดจากชนิดเนื้อหา


22

ฉันต้องการกู้คืนข้อมูลบางส่วนจากฟิลด์ของโหนดทั้งหมดของประเภทเนื้อหาที่เฉพาะเจาะจง ฉันรู้วิธีการใช้ a db_queryและรับ node ID ทั้งหมดจากนั้นทำซ้ำมัน สิ่งที่ฉันอยากรู้คือถ้ามีอีกวิธีหนึ่งในการใช้ฟังก์ชั่น drupal

คำตอบ:


28

คุณสามารถสืบค้นข้อมูลนั้นได้โดยตรง node_load_multiple()

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

คุณสามารถเพิ่มเงื่อนไขคุณสมบัติให้กับ $conditionsอาร์เรย์ (อาร์กิวเมนต์ที่สอง) ได้มากเท่าที่คุณต้องการดังนั้นสถานะสร้าง ฯลฯ เป็นเกมที่ยุติธรรมเช่นกัน

$conditionsถูกเลิกใช้ทางเทคนิค (ฉันจินตนาการถึงความโปรดปรานEntityFieldQuery) แต่โอกาสของการใช้งานที่เคยถูกลบออกจาก Drupal 7 นั้นไม่มีเลย มันจะพังมากเกินไป


3
แม้ว่ามันจะหายไปใน Drupal 8
mpdonadio

ฉันจะยอมรับคำตอบนี้เพราะมันเป็นสิ่งที่ฉันกำลังมองหา แต่จะใช้โซลูชั่น @MPD เพราะมันจะทำงานร่วมกับ Drupal 8 :)
drcelus

@drcelus ใช่วิธีของ MPD เป็นวิธีที่ดีที่สุดแน่นอนฉันน่าจะพูดถึงมัน - EntityFieldQueryทุกอย่าง :) ฉันใส่สิ่งนี้ไว้เพื่อลูกหลานมากกว่าสิ่งอื่นใด
Clive

1
entity_load_multipleมีอยู่ใน D8 คุณไม่สามารถโหลดได้ตามคุณสมบัติ

ขอขอบคุณสำหรับการชี้แจง. ฉันหมายความว่าเงื่อนไข $ หายไปจาก D8
mpdonadio

34

หลัก 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
  }
}

เพื่อหลีกเลี่ยงการโหลดมากเกินไปในครั้งเดียวซึ่งอาจทำให้เกิดปัญหาหน่วยความจำ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.