การใช้ EntityFieldQuery ที่เหมาะสมคืออะไร


37

ใน Drupal 7 เอกสาร API สำหรับการnode_load_multiple()ระบุโดยใช้$conditionsพารามิเตอร์นั้นเลิกใช้EntityFieldQueryแล้ว หนึ่งจะใช้คลาสเพื่อสร้างรายการของ node ID สำหรับใช้กับได้node_load_multiple()อย่างไร มีกรณีการใช้งานอื่น ๆ อีกหรือไม่

คำตอบ:


36

EntityFieldQuery ใช้ชุด hooks เพื่อเชื่อมต่อกับโมดูลหน่วยเก็บข้อมูลเช่น Field SQL Storage เพื่อทำงานกับฟิลด์รวมถึงคุณสมบัติโหนดอื่น ๆ ระยะยาว EntityFieldQuery เป็นวิธีที่เชื่อถือได้มากขึ้นในการสอบถามประเภทของเอนทิตีใด ๆ และในบางสถานการณ์ก็สามารถดำเนินการค้นหาข้ามเอนทิตี (ดูfield_has_dataหรือ_list_values_in_use ()สำหรับตัวอย่าง

นี่เป็นตัวอย่างง่ายๆของการใช้ EntityFieldQuery เพื่อรับรายการโหนดทั้งหมดที่เผยแพร่ก่อนเวลาประทับที่ระบุ:

$query = new EntityFieldQuery();

$query
  ->entityCondition('entity_type', 'node', '=')
  ->propertyCondition('status', 1, '=')
  ->propertyCondition('created', '1294694496', '<');

$result = $query->execute();

$ ผลลัพธ์จากข้อความค้นหานั้นจะมีลักษณะดังนี้:

Array
(
    [node] => Array
        (
            [1] => stdClass Object
                (
                    [nid] => 1
                    [vid] => 49
                    [type] => article
                )

            [2] => stdClass Object
                (
                    [nid] => 2
                    [vid] => 2
                    [type] => page
                )

        )

)

จากนั้นคุณสามารถใช้อาร์เรย์นั้นเป็นอินพุตไปยัง node_load_multiple:

$nodes = node_load_multiple(array_keys($result['node']));

3
field_has_data เป็นตัวอย่างที่ดีกว่า imo กว่า _list_values_in_use

15

ผมพบว่าปัญหาเกี่ยวกับ Drupal EntityFieldQueryเกี่ยวกับการเพิ่มตัวอย่างสำหรับ ฉันใช้มันเป็นตัวอย่างรวมทั้งแสดงความคิดเห็นของฉันเกี่ยวกับการโทรหาตัวอย่างเพิ่มเติม

" เราต้องการตัวอย่าง EntityFieldQuery หรือไม่ "

ความคิดเห็นที่ 11การใช้งานการแสดงของnode_load_multiple()เท่าที่เห็นด้านล่าง:

$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();

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

2
ข้อควรระวังเมธอด fieldOrderBy จะปล่อยให้โหนดใด ๆ ที่ไม่มีฟิลด์ที่เกี่ยวข้องว่างเปล่า สิ่งใดที่ทำให้เกิดความสับสนนี่เป็นเพียงการเรียงลำดับและไม่กรอง (คุณคาดหวังว่าโหนดที่มีฟิลด์ว่างจะอยู่ด้านบนหรือด้านล่างของชุดผลลัพธ์) ข้อมูลเพิ่มเติมและหวังว่าการแก้ไขสามารถพบได้ที่นี่drupal.org/node/1611438และที่นี่drupal.org/node/1662942
Mario Awad

9

นี่คือตัวอย่างจากหนึ่งในโมดูลทดสอบ:

http://api.drupal.org/api/drupal/modules--node--tests--node_access_test.module/function/node_access_entity_test_page/7

เลือกโหนดที่มีฟิลด์เนื้อหาขึ้นต้นด้วย "A" ดูเพิ่มเติมEntityFieldQuery :: execute ()เกี่ยวกับวิธีใช้ผลลัพธ์ที่ส่งคืน

มีหลายกรณีการใช้งานตัวอย่างทั่วไปคือการสอบถามเอนทิตีสำหรับค่าฟิลด์เฉพาะเช่นฟิลด์เนื้อหาดังแสดงในตัวอย่างแรก

ข้อดีคือมันทำงานอะไรก็ได้ field_storage ที่คุณใช้ ตัวอย่างเช่นคุณสามารถมีฟิลด์ของคุณใน MongoDB และ EntityQuery จะยังคงทำงานได้ในขณะที่การสอบถาม field_data_body ด้วยตนเองจะไม่เกิดขึ้น


0

คุณสามารถใช้EntityFieldQuerynode_load_multiple()ระดับการสอบถามฐานข้อมูลและเรียกผลในรูปแบบของรายการที่คล้ายกับ

สิ่งนี้สามารถทำได้โดยการสร้างชั้นเรียนใช้เงื่อนไขและดำเนินการแบบสอบถามเช่น:

<?php
$query = new EntityFieldQuery();
$query
  ->entityCondition('entity_type', 'TYPE') // E.g. node, entityform, taxonomy_term
  ->entityCondition('bundle', 'BUNDLE')
  ->fieldCondition('field_foo', 'value', 'STRING')
  ->range(0,10);
$result = $query->execute();
?>

สิ่งนี้จะสร้างอาเรย์เช่น:

array (
  'TYPE' =>
  array (
    123 =>
    stdClass::__set_state(array(
       'nid' => '123', // Can be also tid when loading terms.
       'key' => 'value',
    )),
    456 =>
    stdClass::__set_state(array(
       'nid' => '456',
       'key' => 'value',
    )),
  ),
)

สามารถดึงข้อมูล ID จาก array current(current($result))->tidผลที่คุณสามารถใช้:

นี่คือตัวอย่างขั้นสูงเพิ่มเติม:

<?php
$query = new EntityFieldQuery();

$query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'article')
  ->propertyCondition('status', NODE_PUBLISHED)
  ->fieldCondition('field_news_types', 'value', 'spotlight', '=')
  ->fieldCondition('field_photo', 'fid', 'NULL', '!=')
  ->fieldCondition('field_faculty_tag', 'tid', $value)
  ->fieldCondition('field_news_publishdate', 'value', $year . '%', 'like')
  ->fieldOrderBy('field_photo', 'fid', 'DESC')
  ->range(0, 10)
  ->addMetaData('account', user_load(1)); // Run the query as user 1.

$result = $query->execute();

if (isset($result['node'])) {
  $news_items_nids = array_keys($result['node']);
  $news_items = entity_load('node', $news_items_nids);
}
?>

ดู: วิธีใช้ EntityFieldQueryที่ Drupal.org สำหรับคำอธิบายเพิ่มเติม

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