EntityFieldQuery का उचित उपयोग क्या है?


37

Drupal 7 में, पैरामीटर का node_load_multiple()उपयोग करने के लिए API प्रलेखन का उपयोग करने के $conditionsपक्ष में पदावनत किया गया है EntityFieldQuery। उपयोग के लिए नोड आईडी की सूची बनाने के लिए कोई वर्ग का उपयोग कैसे करता है node_load_multiple()? क्या इसके लिए कोई अन्य उपयोग के मामले हैं?

जवाबों:


36

EntityFieldQuery फ़ील्ड भंडारण मॉड्यूल के साथ इंटरफ़ेस के लिए हुक का एक सेट का उपयोग करता है, जैसे फ़ील्ड SQL संग्रहण, फ़ील्ड के साथ-साथ अन्य नोड गुणों के लिए। दीर्घकालिक, 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 _list_values_in_use

15

मुझे ड्रुपल पर एक मुद्दा मिला, जिसके लिए उदाहरण जोड़ना था 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
सावधानी, फ़ील्डऑडरबाय विधि संबंधित क्षेत्र को खाली करने वाले किसी भी नोड को छोड़ देगी। जो भ्रामक कारण है कि यह केवल छाँटने के लिए माना जाता है और फ़िल्टर करने के लिए नहीं है (आप खाली फ़ील्ड के साथ नोड्स की अपेक्षा करेंगे कि परिणाम सेट के ऊपर या नीचे हो)। अधिक जानकारी और उम्मीद है कि यहाँ एक सुधार मिल सकता है drupal.org/node/1611438 और यहाँ drupal.org/node/1662942
मारियो अवध

9

यहाँ एक परीक्षण मॉड्यूल से एक उदाहरण है:

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

यह उन नोड्स का चयन करता है जिनके शरीर का क्षेत्र "ए" से शुरू होता है। लौटे परिणाम का उपयोग कैसे करें पर EntityFieldQuery :: निष्पादित () देखें ।

कई उपयोग के मामले हैं, विशिष्ट उदाहरण निकाय क्षेत्र जैसे विशिष्ट फ़ील्ड मान के लिए संस्थाओं को क्वेरी कर रहा है जैसा कि पहले उदाहरण में दिखाया गया है।

लाभ यह है कि यह जो भी फ़ील्ड_स्टोरेज आप उपयोग कर रहे हैं, वह काम करता है। उदाहरण के लिए, आपके पास MongoDB में आपके क्षेत्र हो सकते हैं और EntityQuery फ़ील्ड_data_body को मैन्युअल रूप से क्वेरी नहीं करते हुए भी काम करेगा।


0

आप डेटाबेस को क्वेरी करने और इसके समान सूची के रूप में परिणाम लाने के लिए EntityFieldQuery वर्ग का उपयोग कर सकते हैं node_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',
    )),
  ),
)

परिणाम सरणी से आईडी लाने के लिए, आप उपयोग कर सकते हैं 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);
}
?>

देखें: अधिक स्पष्टीकरण के लिए Drupal.org पर EntityFieldQuery का उपयोग कैसे करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.