EntityFieldQuery बनाम Db_select ()


19

जब मैं मूल्य प्राप्त करने के लिए Db_select () के साथ एक ही काम कर सकता हूं तो मुझे EntityFieldQuery का उपयोग क्यों करना चाहिए ।

यह बेहतर होगा यदि कोई एक उदाहरण प्रदान कर सकता है, न केवल एक लिंक।

जवाबों:


11

मुझे लगता है कि बिंदु यह है कि वाक्यविन्यास बहुत सरल है, और कोड अधिक समझ में आएगा।

उदाहरण के लिए, आप प्रकार के साथ नोड्स चाहते हैं, तो my_typeएक क्षेत्र का नाम दिया है कि field_fooमूल्य के साथ $valDb_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();

14

मुझे लगता है कि मुख्य कारण पसंद की EntityFieldQueryअधिक db_selectआप निचले स्तर संरचना के बारे में पता करने के लिए की जरूरत नहीं है कि, दूसरे शब्दों में है: कैसे सामान डेटाबेस में संग्रहित है। यह ढीली युग्मन में सुधार करता है


6
यह सही है, हालांकि यह आगे भी चलता है। फ़ील्ड संग्रहण प्लग करने योग्य है। डिफ़ॉल्ट कार्यान्वयन डेटाबेस में फ़ील्ड के अनुसार एक अलग तालिका में फ़ील्ड डेटा संग्रहीत करता है, लेकिन इसे प्रतिस्थापित किया जा सकता है, उदाहरण के लिए एक कार्यान्वयन है जो MongoDB में फ़ील्ड डेटा को संग्रहीत करने की अनुमति देता है। यदि आप चाहते हैं कि आपका कोड पोर्टेबल हो और न केवल आपके विशिष्ट साइट कॉन्फ़िगरेशन पर काम करे, तो आपको EntityFieldQuery का उपयोग करना होगा।
बेर्दिर

3

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

EFQ वाक्य-विन्यास अधिक स्पष्ट होने के कारण, मुझे लगता है कि यह व्यक्तिगत प्राथमिकताओं का प्रश्न है। उदाहरण के लिए, मुझे नहीं लगता कि EFQ स्पष्ट है। ध्यान दें कि db_select()EFQ के साथ काम करने वाले रिप्लेसमेंट में रिटर्न वैल्यू टेस्ट और बाद में entity_load()कॉल शामिल होना चाहिए , और यह कोड में बहुत अधिक शोर जोड़ता है, IME:

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


बिल्कुल नहीं, आप Unit_metadata_wrapper का उपयोग कर सकते हैं और केवल उसी चीज़ का उपयोग कर सकते हैं जिसकी आपको आवश्यकता है।
केविन

मैं यह देखने में विफल हूं कि entity_metadata_wrapper()यहां कैसे मदद मिलती है। आपको अभी भी इकाई लोड करने की आवश्यकता है।
flaviovs

1

EntityFieldQuery की तुलना में कहीं अधिक सीमित है db_select(), इसलिए आपके पास उपयोग न करने के लिए वास्तव में एक अच्छा कारण होना चाहिए db_select()(बर्थ उत्तर देखें), जो पढ़ने योग्य पर्याप्त और कहीं अधिक लचीला है।

उदाहरण के लिए, खेतों को लाने के entityFieldQueryलिए इनरजाइन का उपयोग करें । यदि आपको किसी भी कारण से वामपन्थी की आवश्यकता है, तो आप फंस गए हैं ... http://drupal.org/node/1226622


खैर, मैं जानना चाहूंगा कि मेरे एवेज़र के पास "-1" क्यों था। हाँ, UnitFieldQuery प्रीटियर है, लेकिन db_select की तुलना में कम कुशल है जो एक बहुत अच्छा, मजबूत और पूर्ण एपीआई है ... मैं अपने कोड से बहुत सारे निकाय निकालता हूं क्योंकि यह विशिष्ट उपयोग के मामलों के लिए बहुत सीमित था, मुझे लगता है कि यह निश्चित रूप से योग्य है। बताया। वैसे भी।
yann_yinn

1
मुझे लगता है कि कुछ को आपका उत्तर पसंद नहीं है, क्योंकि यह स्वीकार करने में विफल रहता है कि कैसे अलग-अलग स्टोरेज विधियों के ऊपर, UnitFieldQuery एक अमूर्त परत है, जो एक शांत विशेषता है। मैं बहुत सी साइटों पर काम करता हूं जहां हम जानते हैं कि, कहते हैं, MySQL हमेशा x / y / z के लिए डेटाबेस होगा और जब हमें जरूरत होती है तो हम leaner db क्वेरी लिखना भी पसंद करते हैं। मुझे db_select की तुलना में कोई भी प्रीटियरियर होने के लिए UnitFieldQuery नहीं मिलता है। पृष्ठ के शीर्ष पर 2 तुलनाएँ लगभग समान हैं।
चार्ली श्लिसेर

हाँ, यही कारण है कि मैंने लिखा है "देखें तीखा जवाब"। इस विशेष उपयोग-मामले को छोड़कर, db_select अधिक कुशल और कहीं अधिक लचीला होगा।
yann_yinn

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