วิธีโหลดโหนดด้วยค่าฟิลด์


19

ฉันต้องการโหลดโหนดบางอย่าง ฉันไม่รู้รหัสของโหนด แต่ฉันรู้ว่ามันมีฟิลด์แฮชที่ไม่เหมือนใครและฉันรู้แฮชนั้น

ฉันต้องการโหลดโหนดผ่านเขตข้อมูลแฮช ฉันจะทำสิ่งนั้นได้อย่างไร

คำตอบ:


14

คุณสามารถทำได้โดยใช้ EntityFieldQuery

สำหรับ D8 EntityFieldQueryได้ถูกเขียนใหม่

Drupal 8:

$query = \Drupal::entityQuery('entity_test');
$default_langcode_group = $query->andConditionGroup()
  ->condition('user_id', $properties[$default_langcode]['user_id'], '=', $default_langcode)
  ->condition('name', $properties[$default_langcode]['name'], '=', $default_langcode);
$langcode_group = $query->andConditionGroup()
  ->condition('name', $properties[$langcode]['name'], '=', $langcode)
  ->condition("$this->field_name.value", $field_value, '=', $langcode);
$result = $query
  ->condition('langcode', $default_langcode)
  ->condition($default_langcode_group)
  ->condition($langcode_group)
  ->sort('name', 'ASC', $default_langcode)
  ->execute();

ฉันจะดึงค่าของฟิลด์ของเอนทิตีได้อย่างไร

$query = \Drupal::entityQuery('node')
    ->condition('status', 1)
    ->condition('changed', REQUEST_TIME, '<')
    ->condition('title', 'cat', 'CONTAINS')
    ->condition('field_tags.entity.name', 'cats');

$nids = $query->execute();

ดังนั้นถ้าฉันเข้าใจสิ่งนี้อย่างถูกต้องสิ่งนี้จะส่งกลับจำนวนรหัสโหนด (หรือหนึ่งหรือไม่มีขึ้นอยู่กับเงื่อนไข) แต่ฉันยังต้องใช้Node::ในการโหลดโหนดดังกล่าวถูกต้อง?
แอนดรู

ใช่คุณถูก.
DRUPWAY

31

loadByProperties()วิธีที่เร็วที่สุดในการโหลดโหนดที่เฉพาะเจาะจงโดยค่าฟิลด์คือการใช้วิธีการ

คุณระบุค่าฟิลด์ตั้งแต่หนึ่งค่าขึ้นไปและส่งคืนเป็นอาร์เรย์ที่มีโหนดที่ตรงกับค่าของฟิลด์:

$nodes = \Drupal::entityTypeManager()
  ->getStorage('node')
  ->loadByProperties(['title' => $title]);

โดยปกติคุณวนซ้ำโหนด ในกรณีของคุณคุณกำลังมองหาหนึ่งโหนดที่เฉพาะเจาะจง โหนดเดียวยังถูกส่งคืนในอาร์เรย์ดังนั้นให้ใช้reset()และสิ่งนี้จะส่งกลับทั้งโหนดหรือ NULL หากไม่พบสิ่งใดเลย:

if ($node = reset($nodes)) {
  // found $node that matches the title
}

1
ฉันคิดว่าในกรณีของฉันฉันไม่ต้องการส่วนที่สองของรหัส ( $node = reset...) เนื่องจากแฮชนั้นไม่เหมือนใคร
แอนดรู

3
โหนดเดียวยังคงอยู่ในอาร์เรย์ คุณสามารถใช้ $ node = $ nodes [0] แต่คุณจะต้องตรวจสอบว่ามีโหนดหรือไม่ที่จะหลีกเลี่ยงคำเตือนในบันทึกข้อผิดพลาด รีเซ็ต () ดีกว่าเพราะมันจะส่งคืนค่า NULL ในใจ
4k4

ไม่แน่ใจว่าทำไม upvotes ทั้งหมดสำหรับสิ่งนี้; คำถามเดิมคือการโหลดโหนดโดยค่าฟิลด์ พร็อพเพอร์ตี้ (เช่นชื่อเรื่อง) ไม่ใช่ฟิลด์
liquidcms

@lcmcms หัวเรื่องเป็นฟิลด์โหนดและคุณสามารถใช้ฟิลด์โหนดอื่นได้ เขตข้อมูล BTW Drupal มีคุณสมบัติอย่างน้อยหนึ่งรายการ ถ้าเป็นคุณสมบัติเดียว Drupal จะใช้ค่าชื่อคุณสมบัติเป็นส่วนใหญ่ ดังนั้นสำหรับฟิลด์ส่วนใหญ่คำทั้งสองสามารถใช้แทนกันได้
4k4

ดูตัวอย่างนี้สำหรับการสืบค้นสองฟิลด์ที่แตกต่างกันdrupal.stackexchange.com/questions/250306/…
4k4
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.