संपूर्ण नोड लोड किए बिना फ़ील्ड मान प्राप्त करें?


11

मेरे पास एनआईडी की एक बड़ी संख्या है और मुझे प्रत्येक नोड से एक फ़ील्ड मान की आवश्यकता है। क्या कोई फ़ील्ड मान प्राप्त करने के लिए पूरे नोड को लोड करने के ओवरहेड से बचने का कोई तरीका है?

जवाबों:


19

मुझे नहीं लगता कि एपीआई में कुछ भी बनाया गया है, लेकिन एक चुटकी में आप सीधे डेटाबेस को क्वेरी कर सकते हैं:

$entity_type = 'node';
$bundle = 'page';
$nids = array(1, 2, 3);

$field_values = db_select('field_revision_FIELD_NAME', 'f')
  ->fields('f', array('entity_id', 'FIELD_NAME_value'))
  ->condition('entity_type', $entity_type)
  ->condition('bundle', $bundle)
  ->condition('entity_id', $nids, 'IN')
  ->condition('deleted', 0)
  ->execute()
  ->fetchAllKeyed();

यह चलाने के बाद कि आपके पास क्षेत्र मानों की एक सरणी होनी चाहिए, उनके संबंधित नोड्स के द्वारा दर्ज की गई।

यह याद रखने योग्य है कि कॉलम नाम जरूरी नहीं होगा FIELD_NAME_value; उदाहरण के लिए एक नोड संदर्भ क्षेत्र का एक कॉलम नाम होगा FIELD_NAME_nid। आप किसका उपयोग करते हैं यह आपके क्षेत्र के प्रकार पर निर्भर करेगा।

अपडेट करें

ऐसा लगता है कि एपीआई के साथ ऐसा करने का एक तरीका है, लेकिन यह सुंदर नहीं है और इसमें अभी भी एक मैनुअल क्वेरी शामिल है:

// Get the field meta data for the field_id.
$field_name = 'field_something';
$field_info = field_info_field($field_name);
$field_id = $field_info['id'];

// Load up the properties from the node table.
$nids = array(1, 2, 3);
$sql = 'SELECT * FROM {node} WHERE nid IN (:nids)';
$nodes = db_query($sql, array(':nids' => $nids))->fetchAllAssoc('nid');

// Attach the single field to all nodes.
field_attach_load('node', $nodes, FIELD_LOAD_CURRENT, array('field_id' => $field_id));

वह विधि डेटा के लिए डेटा लोड करने के लिए फ़ील्ड आईडी निर्दिष्ट करके $optionsपैरामीटर का लाभ उठाती है field_attach_load()। यह डॉक्स के अनुसार ध्यान देने योग्य है:

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

तो कोड अतिरिक्त फ़ील्ड डेटा लोड करने के लिए प्रकट हो सकता है, लेकिन आपके द्वारा निर्दिष्ट फ़ील्ड के अलावा कुछ भी कैश से आएगा।


बहुत बढ़िया। पूरी तरह से काम किया और पूरे नोड को लोड करने की तुलना में तेजी से किया।
जोरेन

मैंने किसी एकल फ़ील्ड के मान को लोड करने के लिए उपयोगकर्ता इकाई के साथ इस दृष्टिकोण का उपयोग किया है, लेकिन यह विधि उपयोगकर्ता ऑब्जेक्ट से जुड़े सभी फ़ील्ड (और उनके मान) को लोड करती है। क्या मैं कुछ भूल रहा हूँ?
WM

चेतावनी: पहला उदाहरण SQL डेटाबेस (डिफ़ॉल्ट) में फ़ील्ड्स को संग्रहीत करने के लिए है और वैकल्पिक फ़ील्ड स्टोरेज के साथ संगत नहीं है। दूसरा काम करना चाहिए (क्योंकि यह field_attach_load का उपयोग करता है और यह स्टोरेज एब्स्ट्रैक्शन के साथ काम करेगा)।
बोबीक

@ क्लिक करें, क्या ऐसा कोई कारण है जिससे आपने field_dvision_FIELD_NAME के ​​बजाय field_revision_FIELD_NAME का उपयोग किया है? क्या आप समझा सकते हैं? धन्यवाद।
संध्या यादव

3

मैं एक एंटीकॉन्डिशन और फील्ड अटैच लोड का उपयोग करके थोड़ा क्लीनर तरीका ढूंढता हूं।

$query = new EntityFieldQuery();
$query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'story')
  ->propertyCondition('status', 1)
  ->fieldCondition('field_story_image', 'fid', 'NULL', '!=');
$result = $query->execute();

if (isset($result['node'])) {
  $stories = $result['node'];

  // At first we need to get field's id. If you already know field id, you can ommit this step
  // Get all fields attached to a given node type
  $fields = field_info_instances('node', 'story');

  // Get id of body field
  $field_id = $fields['field_story_image']['field_id'];

  // Attach a field of selected id only to get value for it
  field_attach_load('node', $stories, FIELD_LOAD_CURRENT, array('field_id' => $field_id));

  // Get values of our node field
  $output = field_get_items('node', $stories, 'field_story_image');
}

ब्लॉग पोस्ट से http://timonweb.com/loading-only-one-field-from-an-entity-or-bode


0

बड़ी संख्या में एनआईडी होने से एक-एक करके लोडिंग नोड से बचने के लिए, आप node_load_multiple()एक बार में कई नोड लोड करेंगे।

node_load_multiple($nids = array(), $conditions = array(), $reset = FALSE)

आम तौर पर लोडिंग नोड्स कैश्ड होते हैं और यदि आप मेमोरी कैशिंग (जैसे मेमेकैच्ड) का उपयोग कर रहे हैं तो यह तेज़ है, लेकिन यदि आपने बहुत सारे मॉड्यूल इंस्टॉल किए हैं (जैसे कि पठौटो, आदि) तो धीमा हो सकता है।

अन्य तरीका मौजूदा वस्तु का पुन: उपयोग करना है, इसलिए जांचें कि क्या आप इसे सीधे कैश से लोड कर सकते हैं (उदाहरण के लिए form_get_cacheयदि यह प्रपत्र का हिस्सा है) या $_POSTअनुरोध के माध्यम से।

एक और तरीका है EntityFieldQueryकई एनआईडी के साथ उपयोग करना, जैसे

$query->entityCondition('entity_id', array(17, 21, 422), 'IN')

जो डेटाबेस से सीधे मूल्यों को लाएगा।

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