Saya memiliki sejumlah besar NID dan saya perlu satu nilai bidang dari setiap node. Apakah ada cara untuk menghindari overhead memuat seluruh node untuk mendapatkan satu nilai bidang?
Saya tidak berpikir ada sesuatu yang dibangun di dalam API tetapi dalam keadaan darurat Anda bisa menanyakan database secara langsung:
$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();
Setelah menjalankan itu Anda harus memiliki array nilai bidang, dikunci oleh nid masing-masing node.
Patut diingat bahwa nama kolom belum tentu FIELD_NAME_value
; misalnya bidang referensi simpul akan memiliki nama kolom FIELD_NAME_nid
. Yang mana yang Anda gunakan akan tergantung pada jenis bidang Anda.
MEMPERBARUI
Tampaknya ada cara untuk melakukannya dengan API, tetapi itu tidak cantik dan masih melibatkan permintaan manual:
// 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));
Metode itu memanfaatkan $options
parameter field_attach_load()
dengan menetapkan ID bidang untuk memuat data. Perlu dicatat, per dokumen:
Perhatikan bahwa entitas yang dikembalikan dapat berisi data untuk bidang lain, misalnya jika mereka dibaca dari cache.
Jadi kode tersebut mungkin muncul untuk memuat data bidang tambahan, tetapi apa pun selain bidang yang Anda tentukan akan berasal dari cache.
Saya menemukan cara yang sedikit lebih bersih menggunakan entityCondition dan field attach load.
Dari posting blog http://timonweb.com/loading-only-one-field-from-an-entity-or-node
sumber
Untuk menghindari pemuatan simpul satu per satu yang memiliki NID dalam jumlah besar, Anda dapat menggunakan
node_load_multiple()
yang akan memuat banyak node sekaligus:Biasanya memuat node di-cache dan cepat jika Anda menggunakan cache memori (seperti memcached), tetapi bisa lambat jika Anda sudah menginstal terlalu banyak modul (seperti Pathauto, dll).
Cara lain adalah dengan menggunakan kembali objek yang ada, jadi periksa apakah Anda dapat memuatnya langsung dari cache (mis. Via
form_get_cache
apakah itu bagian dari formulir) atau dari$_POST
permintaan.Cara lain adalah menggunakan
EntityFieldQuery
dengan beberapa NID, misyang akan mengambil nilai langsung dari database.
sumber