Bagaimana cara mengakses nilai bidang untuk objek entitas (misalnya simpul)?


63

node_load((int) $nid)memuat entitas simpul yang terisi penuh. $node->title->valuemendapatkan judul, tetapi bagaimana cara mengakses nilai-nilai bidang di Drupal 8?

Jawaban:


89

Saya kira Anda tidak perlu mengubahnya $entitymenjadi array, ini hanya akan berhasil.

$entity->get('field_name')->getValue();

FYI: Menggunakan kint()dari devel_kintmodul akan memberi tahu Anda semua metode yang tersedia yang dapat digunakan untuk mengakses elemen objek, sehingga relatif var_dump()kurang membantu.


14
Sebenarnya seharusnya: $ entity-> get ('field_name') -> value;
Ed Hollinghurst

1
Apakah Anda tahu mengapa ini adalah @EdHollinghurst? getValue memang kesalahan untuk saya, tetapi (menggunakan dpm) itu tercantum dalam metode yang tersedia, sedangkan 'nilai' tidak.
autopoietic

2
getValue()bekerja untuk saya (keduanya pada 8.1.x dan 8.2.x) lihat referensi api
leon.nk

16
->getValue()bersifat generik dan akan berfungsi terlepas dari jenis bidangnya. Jika Anda menggunakan ->value, itu hanya berfungsi jika nilai bidang disimpan di valueproperti. Ini tidak akan bekerja untuk tipe yang lebih kompleks (mis. Tanggal atau referensi entitas).
Pierre Buyle

4
Kode ini saja akan menimbulkan kesalahan jika entitas tidak memiliki bidang bernama "field_name". Pastikan kode ini hanya dijalankan pada entitas tempat Anda tahu bidang itu ada, Anda dapat menggunakan $ entitas-> hasField ('field_name') untuk menguji, atau jika (! Kosong ($ entitas-> field_name))
oknate

56

di drupal 8, $ node menjadi node kelas

 $node->field_machine_name->getValue();

atau

$node->get('field_machine_name')->getValue();

akan mengembalikan array nilai.

Jika Anda hanya mengharapkan satu, Anda mungkin juga harus menggunakan array

$node->field_machine_name->getString();

atau

 $node->get('field_machine_name')->getString();

Saya tidak "mendapatkan" (string dan nilai) "itu". Bisakah Anda menambahkan beberapa detail lagi untuk menjelaskan jawaban ini? FYI: tidak melakukan hal itu membuat jawaban Anda berisiko dihapus melalui moderasi (maaf ...)
Pierre.Vriens

34

Untuk bidang, Anda harus dapat menggunakan $node->body->valuemisalnya. Jika Anda tidak tahu apa nama fieldnya, saya sarankan untuk menginstal modul Devel untuk Drupal 8 dan memeriksa node melalui like dsm($node).


1
bagaimana Anda membuat bidang itu?
Alex

1
ini tampaknya sudah ketinggalan jaman
Alex

1
@Alex Saya sarankan Anda mengajukan pertanyaan baru dengan masalah yang Anda hadapi. Pada saat ini adalah jawaban yang ok, sepertinya tidak cocok untuk mengedit jawaban sekarang yaitu jawaban pada halaman ini yang memiliki lebih banyak poin daripada yang ini.
Tenken

5
Lihat artikel ini untuk penjelasan yang bagus. Anda bisa menggunakan nilai $ node-> field_name-> untuk mendapatkan nilai tunggal (atau kunci pertama bidang multi-nilai). Atau Anda dapat menggunakan $ node-> field_name-> getValue () untuk mendapatkan semua nilai bidang sebagai array.
Mirsoft

2
@tenken: Sebenarnya, memperbarui jawaban yang ada lebih disukai daripada menambahkan pertanyaan yang berlebihan dengan jawaban baru.
Pierre Buyle

17

Anda selalu dapat melakukan $entity->toArray()untuk melihat apa yang ada dalam suatu entitas. Bahkan ketika menggunakan xdebug (misalnya dengan phpstorm) membuat rasa objek entitas sendiri sangat sulit. Saya ragu dsm($node)dalam Drupal 8 masuk akal. Jika Anda bersikeras melakukan debugging di dalam browser (tetapi Anda seharusnya tidak melakukannya, Drupal 8 terlalu rumit untuk di-debug tanpa xdebug) dsm($node->toArray())adalah yang Anda inginkan.


$ node-> toArray () tidak berfungsi untuk saya di Drupal 8.
Axel Briche

Silakan tambahkan pertanyaan baru yang merinci itu. Drupal\Core\Entity\EntityInterfacetelah toArray.

1
Jawaban ini tidak memberikan solusi; downvoting.
colan

Meskipun jawaban ini tidak selalu merupakan jawaban langsung untuk pertanyaan ini, itu adalah fungsi yang sangat bagus. Terima kasih.
Stef Van Looveren

14

Gunakan potongan kode berikut untuk mendapatkan nilai-nilai bidang simpul

Ini digunakan untuk mendapatkan id node dari url

$nid = \Drupal::routeMatch()->getRawParameter($node_id);

Untuk memuat data simpul menggunakan nid

$node = \Drupal::entityTypeManager()->getStorage('node')->load($nid);

Ini digunakan untuk mendapatkan nilai bidang.

$terms = $node->get('field_Name')->getValue();  

Ini digunakan untuk mendapatkan judul simpul.

$product_name = $node->getTitle();

2
Muat simpul seperti ini: $ nid = \ Drupal :: routeMatch () -> getRawParameter ('node'); $ node = \ Drupal :: entityTypeManager () -> getStorage ('node') -> load ($ nid);
rémy

8

Bagi saya, memiliki $entity(simpul) ini berfungsi:

$entity->field_name->getValue();

menggunakan 8.1.


2
Yang ini mendapatkan semua nilai dari bidang multi-nilai ke dalam array. Tentu saja dapat digunakan untuk mendapatkan nilai bidang nilai tunggal juga, namun output kemudian akan berisi array dengan nilai tunggal. Untuk mendapatkan nilai tunggal bidang (atau nilai pertama bidang multi-nilai), gunakan $ entitas-> field_name-> value
Mirsoft

7

Saat menggunakan (cara yang benar sebenarnya):

$node = \Drupal\node\Entity\Node::load($nid);
$node->get('nid')->value; // returns a raw value - Node ID

// Following both returns array structure containing value/target id nested value.
$node->get('nid')->value(); 
$node->nid->getValue();


4

Sederhana saja:

$node->get('field_name')->getValue();

Jika bidang adalah bidang referensi entitas, ada beberapa cara khusus untuk mendapatkan entitas yang direferensikan.

Untuk mendapatkan id target (elemen pertama):

$entity->get('field_entity_reference')->target_id;

Untuk mendapatkan entitas yang dimuat (elemen pertama):

$entity->get('field_entity_reference')->entity;

Saat digunakan ->entitydi lapangan, ia secara otomatis memuat entitas.

Jika bidang dapat berisi beberapa referensi, Anda dapat mengambil semuanya seperti ini:

$entities = $entity->get('field_entity_reference')->referencedEntities();

Itu akan memberi Anda array entitas.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.