जब मैं मूल्य प्राप्त करने के लिए Db_select () के साथ एक ही काम कर सकता हूं तो मुझे EntityFieldQuery का उपयोग क्यों करना चाहिए ।
यह बेहतर होगा यदि कोई एक उदाहरण प्रदान कर सकता है, न केवल एक लिंक।
जब मैं मूल्य प्राप्त करने के लिए Db_select () के साथ एक ही काम कर सकता हूं तो मुझे EntityFieldQuery का उपयोग क्यों करना चाहिए ।
यह बेहतर होगा यदि कोई एक उदाहरण प्रदान कर सकता है, न केवल एक लिंक।
जवाबों:
मुझे लगता है कि बिंदु यह है कि वाक्यविन्यास बहुत सरल है, और कोड अधिक समझ में आएगा।
उदाहरण के लिए, आप प्रकार के साथ नोड्स चाहते हैं, तो 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
आप निचले स्तर संरचना के बारे में पता करने के लिए की जरूरत नहीं है कि, दूसरे शब्दों में है: कैसे सामान डेटाबेस में संग्रहित है। यह ढीली युग्मन में सुधार करता है ।
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()
।
entity_metadata_wrapper()
यहां कैसे मदद मिलती है। आपको अभी भी इकाई लोड करने की आवश्यकता है।
EntityFieldQuery की तुलना में कहीं अधिक सीमित है db_select()
, इसलिए आपके पास उपयोग न करने के लिए वास्तव में एक अच्छा कारण होना चाहिए db_select()
(बर्थ उत्तर देखें), जो पढ़ने योग्य पर्याप्त और कहीं अधिक लचीला है।
उदाहरण के लिए, खेतों को लाने के entityFieldQuery
लिए इनरजाइन का उपयोग करें । यदि आपको किसी भी कारण से वामपन्थी की आवश्यकता है, तो आप फंस गए हैं ...
http://drupal.org/node/1226622