เหตุใดฉันจึงควรใช้EntityFieldQueryเมื่อฉันสามารถทำงานเดียวกันกับDb_select ()เพื่อดึงค่า
มันจะดีกว่าถ้ามีคนสามารถให้ตัวอย่างไม่ใช่แค่ลิงค์
เหตุใดฉันจึงควรใช้EntityFieldQueryเมื่อฉันสามารถทำงานเดียวกันกับDb_select ()เพื่อดึงค่า
มันจะดีกว่าถ้ามีคนสามารถให้ตัวอย่างไม่ใช่แค่ลิงค์
คำตอบ:
ฉันคิดว่าประเด็นคือไวยากรณ์ง่ายกว่ามากและรหัสจะเข้าใจได้ง่ายขึ้น
ตัวอย่างเช่นถ้าคุณต้องการโหนดที่มีประเภทmy_type
ที่มีเขตข้อมูลชื่อที่field_foo
มีค่า$val
ด้วย Db_Select, yuoll ทำสิ่งที่ชอบ:
$nids = db_select('node', 'n')
->fields('n', array('nid'))
->join('field_data_field_foo', 'foo', 'foo.entity_id = n.nid')
->condition('n.type', 'my_type')
->condition('foo.field_foo_value', $val)
->execute()->fetchCol();
ซึ่งง่ายกว่ามากกับ EntityFieldQuery:
$query = new EntityFieldQuery;
$entities = $query->entityCondition('entity_type', 'node')
->entityCondition('bundle', 'my_type')
->fieldCondition('field_foo', 'value', $val)
->execute();
ฉันคิดว่าเหตุผลหลักที่นิยมใช้EntityFieldQuery
มากกว่าdb_select
ก็คือคุณไม่จำเป็นต้องรู้เกี่ยวกับโครงสร้างระดับล่างอีกนัยหนึ่ง: วิธีจัดเก็บข้อมูลในฐานข้อมูล นี้จะช่วยปรับปรุงcoupling หลวม
EntityFieldQuery (EFQ) จะส่งคืนรหัสเอนทิตีเท่านั้น หากคุณต้องการเข้าถึงข้อมูลเอนทิตีคุณจะต้องโทรหาentity_load()
ซึ่งในระหว่างการโหลดข้อมูลจะทำให้แน่ใจว่าสิ่งพื้นฐานทั้งหมดที่คุณไม่สนใจ (เช่นการโหลดฟิลด์การเรียกโมดูลอื่น ๆ เป็นต้น) . แน่นอนว่าสิ่งนี้ส่งผลให้แบบสอบถาม SQL สองรายการและค่าใช้จ่ายจำนวนมาก แต่นี่เป็นราคาที่ต้องชำระสำหรับสิ่งที่เป็นนามธรรม
สำหรับไวยากรณ์ของ EFQ นั้นชัดเจนมากขึ้นฉันคิดว่ามันเป็นคำถามของความชอบส่วนตัวมากกว่า ยกตัวอย่างเช่นฉันไม่คิดว่า EFQ ชัดเจนกว่า โปรดสังเกตว่าการdb_select()
แทนที่การทำงานกับ EFQ จะต้องมีการทดสอบค่าส่งคืนและการentity_load()
โทรในภายหลังและจะเพิ่มเสียงรบกวนให้กับรหัส IMHO:
$query = new EntityFieldQuery();
$entities = $query->entityCondition('entity_type', 'node')
->entityCondition('bundle', 'my_type')
->fieldCondition('field_foo', 'value', $val)
->execute();
if (!empty($entities['node'])) {
$nodes = entity_load('node', array_keys($entities['node']));
} else {
$nodes = array();
}
ดังนั้นการตอบคำถามของคุณ: ใช้ EFQ หากเอนทิตีของคุณมีคุณสมบัติครบถ้วน (เช่นเป็นฟิลด์, สามารถใช้โดยโมดูลอื่น ๆ ฯลฯ ) และ / หรือคุณคิดว่าไวยากรณ์ของมันชัดเจนกว่า หากมีกรณีอื่นให้ใช้งานdb_select()
ได้
entity_metadata_wrapper()
ที่นี่ คุณยังต้องโหลดเอนทิตี
EntityFieldQueryมีข้อ จำกัด มากกว่าdb_select()
ดังนั้นคุณควรมีเหตุผลที่ดีที่จะไม่ใช้db_select()
(ดูคำตอบของบาร์ต) ซึ่งอ่านได้ง่ายและยืดหยุ่นมากขึ้น
ตัวอย่างเช่นentityFieldQuery
ใช้innerJoinเพื่อดึงข้อมูลฟิลด์ หากคุณต้องการซ้ายเข้าร่วมด้วยเหตุผลใดก็ตามคุณติดกับ ...
http://drupal.org/node/1226622