Mam dużą liczbę identyfikatorów NID i potrzebuję jednej wartości pola z każdego węzła. Czy jest jakiś sposób, aby uniknąć obciążenia związanego z ładowaniem całego węzła w celu uzyskania jednej wartości pola?
Nie sądzę, że w API jest coś wbudowanego, ale w mgnieniu oka można po prostu zapytać bezpośrednio bazę danych:
$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();
Po uruchomieniu powinieneś mieć tablicę wartości pól, wpisanych przez numer identyfikacyjny odpowiedniego węzła.
Warto pamiętać, że nazwa kolumny niekoniecznie musi być FIELD_NAME_value
; na przykład pole odwołania do węzła miałoby nazwę kolumny FIELD_NAME_nid
. To, którego użyjesz, będzie zależeć od typu pola.
AKTUALIZACJA
Wygląda na to, że można to zrobić za pomocą interfejsu API, ale nie jest ładny i nadal wymaga ręcznego zapytania:
// 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));
Ta metoda wykorzystuje ten $options
parametr field_attach_load()
, określając identyfikator pola, dla którego mają zostać załadowane dane. Warto zauważyć, według dokumentów:
Zwróć uwagę, że zwrócone jednostki mogą zawierać dane dla innych pól, na przykład jeśli są one odczytywane z pamięci podręcznej.
Wygląda więc na to, że kod ładuje dodatkowe dane pola, ale wszystko inne niż pole określone przez Ciebie będzie pochodzić z pamięci podręcznej.
Znajduję nieco czystszy sposób, używając encji Warunek i podłączanie obciążenia pola.
Z posta na blogu http://timonweb.com/loading-only-one-field-from-an-entity-or-node
źródło
Aby uniknąć ładowania węzła jeden po drugim, posiadającego dużą liczbę NID, możesz użyć,
node_load_multiple()
który załaduje wiele węzłów za jednym razem:Zwykle ładowanie węzłów jest buforowane i jest szybkie, jeśli używasz buforowania pamięci (jak memcached), ale może być powolne, jeśli masz zbyt wiele zainstalowanych modułów (takich jak Pathauto itp.).
Innym sposobem jest ponowne użycie istniejącego obiektu, więc sprawdź, czy możesz załadować go bezpośrednio z pamięci podręcznej (np. Poprzez,
form_get_cache
jeśli jest to część formularza) lub z$_POST
żądania.Innym sposobem jest użycie
EntityFieldQuery
z wieloma identyfikatorami NID, npktóry pobierze wartości bezpośrednio z bazy danych.
źródło