EntityFieldQuery इनर शामिल हैं


21

मैं EntityFieldQuery ऑब्जेक्ट का उपयोग करके एक क्वेरी चलाना चाहता हूं। मुझे नोड और नोड_ दोनों अतिरिक्त तालिका से मूल्य की आवश्यकता है इसलिए मुझे INNER JOIN का उपयोग करना होगा। डॉक्यूमेंटेशन से मैं यह पता नहीं लगा सकता कि यह कैसे संभव है।

यहाँ मेरे पास क्या है -

$query = new EntityFieldQuery();
$result = $query->entityCondition('entity_type', 'node')
->entityCondition('bundle', 'node_access')
->propertyCondition('type', 'external_link')
->propertyCondition('status', 1)
->fieldCondition('gid', '3', '=')
->fieldCondition('realm', 'domain_id', '=')
->fieldCondition('grant_view', '1', '>=')
->range(0,1)
->execute();

1
हालाँकि यह Drupal 7 में ऑन-द-फ्लाई नहीं किया जा सकता है, यह Drupal 8 (इस लेखन के समय अप्रकाशित) में किया जा सकता है। देखें इकाई क्षेत्र क्वेरी को विवरण के लिए समर्थन मिला (उदाहरण सहित)।
कोलन

Drupal 8 में सभी शर्तें इस तरह हैं (-> कंडीशन ())। D8 में एक EFQ से बाहर: $ परिणाम = \ Drupal :: unitQuery ('नोड') -> स्थिति ('प्रकार', सरणी ('एंट्री_ए', 'एंट्री_ब'), 'IN') -> स्थिति ('स्थिति') , NODE_PUBLISHED) -> स्थिति ('field_myfield.value', '5', '=') -> execute (); Drupal 8 EFQ में टकराहट सीधे नाम फ़ील्ड में field_name.value या field_name.target_id द्वारा ड्रुपल 7 में परिभाषित की गई है->fieldCondition('field_name', 'target_id', $entities_a, 'IN');
woprrr

जवाबों:


30

आप EntityFieldQueryसीधे एक अतिरिक्त जोड़ नहीं सकते (यह समर्थित नहीं है), लेकिन आप क्वेरी में एक टैग जोड़ सकते हैं, कार्यान्वित कर सकते हैं hook_query_TAG_alter(), और जब क्वेरी को मानक db क्वेरी में बदल दिया जाता है, तो मैन्युअल रूप से जोड़ सकते हैं।

इसका परीक्षण नहीं किया गया है, लेकिन संभवत: आपको इसका अधिकांश तरीका मिल जाएगा:

$query = new EntityFieldQuery;
$query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'node_access')
  // etc
  ->addTag('MYTAG');

// get the query results as normal

और फिर क्वेरी परिवर्तन फ़ंक्शन:

function MYDMOULE_query_MYTAG_alter(QueryAlterableInterface $query) {
  $query->join('node_access', 'node_access', 'node_access.nid = node.nid');
}

इसे करने का दूसरा तरीका EntityFieldQueryखुद को उप-सम्मिलित करना और जुड़ना होगा, लेकिन मुझे लगता है कि इस मामले में उपरोक्त विधि सरल है।


क्या किसी एकल फ़ंक्शन में ऐसा करने का एक बेहतर तरीका है? भले ही यह नहीं हैEntityFieldQuery
एलन थॉमस

2
वास्तव में, केवल दूसरा तरीका क्वेरी का निर्माण मैन्युअल रूप से उपयोग करना है db_select, फिर आप इसे जितना चाहें उतना नियंत्रण कर सकते हैं
क्लाइव

मैं उसके साथ जाऊँगा। Thx
एलन थॉमस

@ क्लाइव ... ओह यह जवाब वाकई दिलचस्प है। पसंद है। : पी
टेनकेन

2
@ मिचिल कोई EntityFieldQueryकैशिंग नहीं करता है, यह बस के चारों ओर लपेटता है SelectQueryऔर संस्थाओं के लिए कुछ तरीके जोड़ता है। उन अतिरिक्त तरीकों मामूली (बहुत मामूली) प्रदर्शन कमी के लिए खाते में आप के रूप में एक नियमित रूप से करने के लिए विरोध का उपयोग करने का अनुभव थाSelectQuery
क्लाइव

3

यदि आप अपने स्वयं के तालिकाओं के साथ कस्टम गुणों का उपयोग कर रहे हैं, तो टैग विधि काम नहीं करेगी। आपको इसके स्थान पर उप-वर्ग का उपयोग करना होगा:

$query = new EntityFieldQuery();
$query->entityCondition('entity_type', 'user');

$roles_subquery = db_select('users_roles', 'ur');
$roles_subquery->fields('ur', array('uid'));
$roles_subquery->condition('rid', $my_role_id);

$query->propertyCondition('uid', $roles_subquery, 'IN');

एक EntityFieldQuery में शामिल होने की आवश्यकता देखें , एक उपश्रेणी के बारे में कैसे? ब्योरा हेतु।


कस्टम टेबल के साथ, मेरे जैसे मामलों के लिए उत्कृष्ट समाधान। अद्भुत कार्य!
इग्नासियो सेगुरा पोस्टिगो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.