รับเฉพาะบางฟิลด์ด้วย EntityFieldQuery หรือไม่


19

Drupal 7 มีระบบการสืบค้น ORM ที่คล้ายกับ ORM ที่มีแนวโน้มมาก

ขณะนี้ฉันเข้าใจวิธีการเลือกโหนด แต่ผลลัพธ์ไม่ได้มีข้อมูลเฉพาะเช่น fileds ฉันกำลังมองหา

$query = new EntityFieldQuery();
$entities = $query->entityCondition('entity_type', 'node')
                        ->entityCondition('bundle', 'event')
                        ->propertyCondition('status', 1)
                        ->fieldCondition('field_date', 'value', array('2011-03-01', '2011-03-31'), 'BETWEEN')
                        ->fieldOrderBy('field_date', 'value', 'ASC')
                        ->execute();

ดังนั้นเราจำเป็นต้องโหลดข้อมูลทั้งหมดของโหนดถ้าเราต้องการรับค่าของฟิลด์เดียวเช่น 'field_date' ในตัวอย่างปัจจุบัน

$nodes = entity_load('node', array_keys($entities['node']));

หากมีวิธีการรับค่าของเขตข้อมูลแทนการโหลดข้อมูลทั้งหมดของโหนดทั้งหมดเนื่องจากจะกระตุ้นหน่วยความจำเกินพิกัดบางส่วน

$nodesFieldDates = ???

คำตอบ:


10

เป็นคำถามที่ดีมาก!

EntityFieldQuery เป็นสิ่งที่ดีอย่างแท้จริง แต่ถ้าคุณจริงๆต้องการที่จะได้รับร้ายแรงคุณต้องแทนที่ชั้นในโมดูลที่กำหนดเองและเพิ่มพฤติกรรมสิ่งที่คุณต้องทำในการมี

ฉันไม่ทราบถึงความตั้งใจที่แท้จริงของคุณ แต่ฉันได้แนะนำตัวเองกับบทความนี้ในเรื่องที่ผ่านมา ให้เครดิตกับ Neil Hastings สำหรับการเขียนที่ดี

ค้นหาตัวอย่างรหัสเล็กน้อยในบทความสำหรับตัวอย่างที่ดีของการเอาชนะ

หวังว่าจะช่วยได้มีความสุขการเข้ารหัส!


ตกลงฉันเข้าใจแล้ว! ดังนั้นอาจเป็นไปได้ที่จะกำหนดวิธีการ "EntityFieldQuery" "buildQuery" ใหม่เพื่อสลับฟิลด์ผลลัพธ์ อาจเป็นเช่นนี้อาจทำงานได้
Fedir RYKHTIK

11

ฉันพบคำตอบสำหรับสิ่งนี้! Apache Solr โมดูลขยายคลาส EntityFieldQueryเพื่อให้มันเกิดขึ้น มันเพิ่มวิธีการใหม่ที่เรียกว่า addExtraField

<?php
$query = new ApachesolrAttachmentsEntityFieldQuery();
$entities = $query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'event')
  ->propertyCondition('status', 1)
  ->fieldCondition('field_date', 'value', array('2011-03-01', '2011-03-31'), 'BETWEEN')
  ->fieldOrderBy('field_date', 'value', 'ASC')
  ->addExtraField('field_date', 'value', 'value')
  ->execute();
?>

หากคุณไม่ได้ติดตั้ง Apache Solr เพียงแค่คัดลอกรหัสเพื่อขยายคลาสนั้น


สร้าง sandbox สำหรับสิ่งนี้เนื่องจากโมดูล Apache Solr มีข้อบกพร่องบางอย่างdrupal.org/sandbox/mikeytown2/2209909
mikeytown2

2
อัปเดตคำตอบนี้ง่ายๆสำหรับโมดูล (แซนด์บ็อกซ์ปัจจุบัน) ที่สร้างขึ้นโดย mikeytown2 (ขอบคุณ!)
Oliver Coleman

ดูเหมือนว่าลิงก์ในคำตอบจะใช้งานไม่ได้ มีข้อความแจ้งว่า "คุณต้องลงชื่อเข้าใช้หรือลงทะเบียนก่อนดำเนินการต่อ"
mbomb007

@ mbomb007 github.com/AmazeeLabs/apachesolr_attachments/blob/… อัปเดตลิงก์
mikeytown2

8

คุณไม่จำเป็นต้องลบล้างอะไรหรือขยายชั้นเรียน คุณเพียงแค่ต้องใช้field_attach_load()เพื่อแนบฟิลด์ที่คุณต้องการกับผลการEntityFieldQueryเรียน

ดูการโหลดเพียงหนึ่งฟิลด์จากเอนทิตีหรือโหนดใน Drupal 7บทความที่ดีพร้อมตัวอย่างเกี่ยวกับวิธีการทำ


0

ใครก็ตามที่ยังต้องการได้รับ Fields จาก EFQ มาดูที่โมดูลEFQ Extra Fields

คำเตือน: โมดูลนี้ละเมิด EntityFieldQuery เพื่อส่งคืนข้อมูลจากฐานข้อมูลของคุณ มันไม่ทำงานกับเอนทิตีหรือโมดูลใด ๆ ที่สร้างขึ้นบนพวกเขา

จะช่วยให้คุณใช้ addField ภายในวัตถุ EntityFieldQueryExtraFields (ขยายวัตถุ EntityFieldQuery) เริ่มแรก EntityFieldQuery จะให้ข้อมูลรหัสเอนทิตีบันเดิลและเอนทิตีเท่านั้น โมดูลนี้เพิ่มเลเยอร์พิเศษเพิ่มเติมจากนั้นโดยไม่ต้องทำเอนทิตีพิเศษเพิ่มเติม! สิ่งสำคัญถ้าคุณต้องการทำงานกับข้อมูลจำนวนมากและคุณต้องการลดแบบสอบถาม SQL เนื่องจาก EFQ สอบถามฐานข้อมูลสำหรับข้อมูลนี้อยู่แล้วทำไมไม่ปรับเปลี่ยนแบบสอบถามนั้นเพื่อให้ฟิลด์เพิ่มเติมแก่คุณ ซึ่งหมายความว่าจะไม่มีการสืบค้นคำถามเพิ่มเติมเพียงรายการเดียวเพื่อรับข้อมูลนั้น

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

ตัวอย่าง

กำลังดึงชื่อโหนด

$ query = ใหม่ EntityFieldQueryExtraFields ();
  $ result = $ query-> entityCondition ('เอนทิตี _type', 'โหนด')
  -> propertyCondition ('type', 'my_bundle_type')
  -> propertyCondition ('สถานะ', 1)
  -> addExtraField ('field_myfield', ค่า ', ค่า')
  -> addExtraField ('field_mynodereffield', nid ', nid')
  -> addExtraField ('', 'ชื่อ', 'ชื่อ', 'โหนด')
  -> fieldCondition ('field_myfield', 'value', 'some_value_to_filter_on', '=')
  -> รัน ();
ชุดค่าผสมที่เป็นไปได้:
addExtraField ($ field_name, $ column, $ column_alias = NULL, $ table = NULL)

FIELD_NAME
ระบุจากฟิลด์ที่ควรมีฟิลด์พิเศษ ถ้ามันมาจากตารางฐานปล่อยให้มันว่างเปล่าและกรอกอาร์กิวเมนต์ในตาราง

คอลัมน์
ระบุชื่อของคอลัมน์

column_alias
ระบุนามแฝงของคอลัมน์

โต๊ะ
หรือเพิ่มบางสิ่งเช่นโหนดหรือผู้ใช้ที่นี่ (ตารางฐาน)

ฉันได้ลองทั้งโมดูลนี้ (EFQ Extra Fields) และโมดูล (แซนด์บ็อกซ์ปัจจุบัน) โดย mikeytown2 และรุ่นหลังดูดีขึ้นกว่านี้ (ดีกว่าการใช้งานเอาต์พุตที่สมเหตุสมผลมากขึ้น) และดูเหมือนว่าจะรักษาไว้ได้ดีกว่าเดิม โมดูล mikeytown2 Sandbox ที่drupal.org/sandbox/mikeytown2/2209909
Oliver Coleman
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.