EntityFieldQuery के साथ केवल कुछ फ़ील्ड प्राप्त करें?


19

Drupal 7 में EntityFieldQuery के साथ बहुत ही होनहार ORM-like सिस्टम है।

वर्तमान में, मैं समझता हूं कि नोड्स का चयन कैसे किया जाए, लेकिन परिणाम में कोई विशिष्ट जानकारी नहीं है, जैसे दायर, मैं देख रहा हूं।

$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 वास्तव में अच्छा सामान है, लेकिन अगर आप वास्तव में गंभीर होना चाहते हैं, तो आपको एक कस्टम मॉड्यूल में कक्षा को ओवरराइड करना होगा और वहां आपको जो भी व्यवहार की आवश्यकता है उसे जोड़ना होगा।

मैं आपके सटीक इरादों को नहीं जानता, लेकिन मैंने पिछले दिनों इस विषय पर खुद को इस लेख में संदर्भित किया है। इस अच्छी तरह से लिखे गए लेखन के लिए नील हेस्टिंग्स को श्रेय।

ओवरडाइडिंग के अच्छे उदाहरणों के लिए लेख में कोड उदाहरणों के लिए थोड़ा देखें।

आशा है कि मदद करता है, खुश कोडिंग!


ठीक है मैं समझा ! तो, शायद, परिणामी क्षेत्रों को वैकल्पिक करने के लिए "EntityFieldQuery" "buildQuery" विधि को फिर से परिभाषित करना संभव है। शायद, यह काम कर सकता है।
फेडिर RYHTIK

11

मुझे इसका उत्तर मिल गया! अपाचे सोलर मॉड्यूल ऐसा करने के लिए 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();
?>

यदि आपके पास अपाचे सोलर स्थापित नहीं है तो बस उस वर्ग को बढ़ाने के लिए कोड की प्रतिलिपि बनाएँ।


इसके लिए एक सैंडबॉक्स बनाया गया क्योंकि अपाचे सोलर मॉड्यूल में कुछ कमियां थीं 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

कोई भी अभी भी EFQ से फ़ील्ड प्राप्त करना चाहता है, EFQ अतिरिक्त फ़ील्ड्स मॉड्यूल पर एक नज़र डालें ।

चेतावनी: यह मॉड्यूल आपके डेटाबेस से डेटा वापस करने के लिए EntityFieldQuery का दुरुपयोग करता है। यह संस्थाओं या उन पर बनने वाले किसी भी मॉड्यूल के साथ काम नहीं करता है।

यह आपको एक EntityFieldQueryExtraFields ऑब्जेक्ट के भीतर AddField का उपयोग करने की अनुमति देता है (EntityFieldQuery ऑब्जेक्ट का विस्तार करता है)। प्रारंभ में EntityFieldQuery केवल आपको इकाई आईडी, बंडल और इकाई प्रकार वापस देता है। यह मॉड्यूल कुछ अतिरिक्त एंटिटी_लोड्स किए बिना उसके ऊपर एक अतिरिक्त लेयर जोड़ता है! महत्वपूर्ण यदि आप भारी मात्रा में डेटा के साथ काम करना चाहते हैं और आप एसक्यूएल प्रश्नों को कम करना चाहते हैं। चूंकि EFQ पहले से ही इस जानकारी के लिए डेटाबेस पर सवाल उठाता है, इसलिए उस क्वेरी को आपको कुछ अतिरिक्त फ़ील्ड देने के लिए भी क्यों नहीं बदलना चाहिए। इसका मतलब है कि उस डेटा को प्राप्त करने के लिए एक भी अतिरिक्त क्वेरी नहीं की जाएगी।

सतर्कता का एक शब्द, यदि आप कुछ पोस्ट-फॉर्मेटिंग / पोस्ट-लोडिंग पर भरोसा करते हैं, जो एंट्रेस_लोड या इसी तरह के कार्यों में होता है, तो यह मॉड्यूल उस पर ध्यान नहीं देगा। आपको पुनः प्राप्त डेटा की वैधता सुनिश्चित करनी होगी।

उदाहरण

नोड शीर्षक प्राप्त करना

$ क्वेरी = नया EntityFieldQueryExtraFields ();
  $ परिणाम = $ क्वेरी-> एंटीकॉन्डिशन (t एंट्री_टाइप ’, $ नोड’)
  -> गुणसंवाद ('प्रकार', 'my_bundle_type')
  -> संपत्तिकरण ('स्थिति', 1)
  -> addExtraField ('field_myfield', value ', value')
  -> addExtraField ('field_mynodereffield', nid ', nid')
  -> addExtraField ('', 'शीर्षक', 'शीर्षक', 'नोड')
  -> फील्डकंडिशन ('field_myfield', 'value', 'some_value_to_filter_on', '=')
  -> पर अमल ();
संभावित संयोजन:
addExtraField ($ field_name, $ कॉलम, $ column_alias = NULL, $ table = NULL)

क्षेत्र का नाम
निर्दिष्ट करें कि किस क्षेत्र से अतिरिक्त क्षेत्र आना चाहिए। यदि यह आधार तालिका से है, तो इसे खाली छोड़ दें और तालिका तर्क में भरें

स्तंभ
कॉलम का नाम निर्दिष्ट करें,

column_alias
स्तंभ का उपनाम निर्दिष्ट करें,

तालिका
वैकल्पिक रूप से, नोड या उपयोगकर्ता की तरह कुछ यहाँ जोड़ें (बेस टेबल),

मैंने इस मॉड्यूल (EFQ एक्सट्रा फील्ड्स) और mikeytown2 द्वारा (वर्तमान में सैंडबॉक्स) मॉड्यूल दोनों की कोशिश की है और बाद में बहुत बेहतर लग रहा था (उपयोग करने के लिए अच्छे, अधिक समझदार आउटपुट) और यह भी पूर्व की तुलना में बहुत बेहतर बनाए रखा प्रतीत होता है। mikeytown2 सैंडबॉक्स मॉड्यूल drupal.org/sandbox/mikeytown2/2209909 पर है
ओलिवर कोलमैन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.