Yanıtlar:
API yerleşik bir şey olduğunu sanmıyorum ama bir çimdik sadece doğrudan veritabanını sorgulamak olabilir:
$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();
Bunu çalıştırdıktan sonra, kendi düğümünün nid ile anahtarlanmış bir dizi alan değerine sahip olmalısınız.
Sütun adının mutlaka olmayacağını hatırlamakta fayda var FIELD_NAME_value
; örneğin, bir düğüm referans alanının sütun adı olacaktır FIELD_NAME_nid
. Hangisini kullanacağınız alan türünüze bağlı olacaktır.
GÜNCELLEME
API ile yapmanın bir yolu var gibi görünüyor, ancak hoş değil ve yine de manuel bir sorgu içeriyor:
// 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));
Bu yöntem, verilerin yükleneceği alan kimliğini belirterek $options
parametreden yararlanır field_attach_load()
. Dokümanlara göre dikkat çekmeye değer:
Döndürülen varlıkların, örneğin önbellekten okunuyorsa, diğer alanlar için veri içerebileceğini unutmayın.
Bu nedenle, kod fazladan alan verisi yüklemiş gibi görünebilir, ancak belirttiğiniz alan dışındaki herhangi bir şey önbellekten gelir.
Bir entityCondition ve alan ekleme yükü kullanarak biraz daha temiz bir yol bulmak.
$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');
}
Blog yazısından http://timonweb.com/loading-only-one-field-from-an-entity-or-node
Çok sayıda NID içeren düğümü tek tek yüklemekten kaçınmak için node_load_multiple()
, tek seferde birden çok düğümü yükleyecek olanları kullanabilirsiniz :
node_load_multiple($nids = array(), $conditions = array(), $reset = FALSE)
Normalde düğümlerin yüklenmesi önbelleğe alınır ve bellek önbelleği (memcached gibi) kullanıyorsanız hızlıdır, ancak çok fazla modül (Pathauto vb.) Yüklüyse yavaş olabilir.
Diğer yol, mevcut nesneyi yeniden kullanmaktır, bu nedenle doğrudan önbellekten (örneğin form_get_cache
formun bir parçasıysa) veya $_POST
istekten yükleyip yükleyemeyeceğinizi kontrol edin .
Başka bir yol, EntityFieldQuery
birden fazla NID ile kullanmaktır , ör.
$query->entityCondition('entity_id', array(17, 21, 422), 'IN')
bu da değerleri doğrudan veritabanından alır.