Untuk mendapatkan nilai dari entitas, ada dua cara:
- Gunakan
field_get_items
dan dapatkan nilai suatu bidang - Gunakan
entity_metadata_wrapper
dan dapatkan nilai suatu bidang
Meskipun entity_metadata_wrapper
abstrak menjauhkan perbedaan bahasa, API-nya terkadang masih canggung, terutama saat menggunakan PHP 5.3. Misalnya, mendapatkan nilai bidang teks yang panjang biasanya melewati rute ini:
$field = $wrapper->field->value();
print $field['safe_value'];
Untungnya, PHP 5.4 mendukung sintaks ini: print $wrapper->field->value()['safe_value'];
.
Tetapi pertanyaan saya lebih mementingkan kinerja. Bagaimana cara keduanya bekerja? Apakah mereka meminta basis data setiap kali mereka meminta nilai? Apakah entity_metadata_wrapper
meminta semuanya sekaligus? (Membuat field_get_item
lebih cocok untuk pengambilan nilai-tunggal.)
Saya tidak cukup berani untuk menyelam jauh ke sumber Drupal.
performance
entities
Florian Margaine
sumber
sumber
field_view_field()
adalah untuk merender bidang. Fungsi untuk mendapatkan nilai bidang adalah field_get_items () .field_get_items()
mengeluarkan nol overhead database jadi saya pikir itu kasus yang cukup terbuka dan tertutup :)field_get_items()
menimbulkan overhead database nol? Itu harus mendapatkan datanya di suatu tempat, kan?entity_metadata_wrapper
kerjanya, kinerja-bijaksana.field_get_items()
sehingga biaya overhead telah dikeluarkan ... ini sedikit rute yang dicekik di D7 untuk jujurJawaban:
Jawaban singkat: field_get_items () lebih berkinerja daripada entity_metadata_wrapper ().
Lihat kode untuk fungsi-fungsi ini:
Keduanya mengharuskan Anda untuk melewati entitas, yang telah dimuat dari database . Sebagai contoh:
atau, seperti yang telah Anda sarankan:
Kedua contoh ini agak mengganggu saya karena logika konyol dalam mencoba untuk mendapatkan nilai yang sudah tersedia untuk Anda, tetapi mereka tentu berguna dalam banyak kasus.
Anda bisa melakukannya
print $node->field_my_field_name[LANGUAGE_NONE][0]['value'];
tetapi itu akan menimbulkan kesalahan pemberitahuan PHP jika bidang tidak memiliki nilai, karena Anda mencoba mengakses array yang mungkin tidak ada (yaitu[LANGUAGE_NONE][0]['value']
). Saya menemukan diri saya melakukan ini cukup sering belakangan ini:yang jauh lebih bersih daripada melakukan:
Jika Anda melihat kode untuk
field_get_items())
Anda akan melihat bahwa itu tidak melakukan apa-apa lagi maka memastikan bahwa array bidang memiliki data dalam bahasa saat ini dan kemudian mengembalikannya. Jadi, overhead menjalankan fungsi sekecil itu dapat diabaikan, tetapi jika Anda benar-benar peduli dengan kinerja, Anda bisa melakukan pemeriksaan sendiri apakah data ada dan kemudian mencetaknya.Sunting: Karena
field_get_items()
menjalankanfield_language()
sebenarnya ada hit kinerja yang lebih besar daripada hanya memeriksa bahasa, jadi, jika Anda sudah tahu bahwa $ entitas-> bahasa ada, Anda bisa menulis fungsi super-kinerja Anda sendiri:sumber
$node = node_load(123);
dalam 1 skrip dan melakukannya lagi di tempat lain, Anda tidak dikenakan kinerja overhead dari objek penuh memuat dan membangun - Drupal hanya memberikan variabel itu salinan entitas yang ada. Jika Anda ingin memuat salinan baru , Anda harus meneruskan$reset = TRUE
ke fungsi memuat entitas. Juga, lihat hasil edit saya mengenai pengambil yang berkinerja super.if (isset($node->field_my_field_name[LANGUAGE_NONE]) && isset($node->field_my_field_name[LANGUAGE_NONE][0])) {
tidak perlu,isset($node->field_my_field_name[LANGUAGE_NONE][0]
sudah cukup.isset($node->field_my_field_name[LANGUAGE_NONE])
karena bahasa tidak akan disetel pada bidang kosong? Saya pikir itu adalah delta /[0]
yang berlebihan.