Secara terprogram, dapatkan semua nama bidang referensi entitas


10

Contoh: Saya ingin mendapatkan semua nama tag yang ada di dalam field_tags dari simpul 5.

Saya bisa mendapatkan target_id dengan $ node-> field_tags-> getValue () ;

masukkan deskripsi gambar di sini

Tapi masalahnya adalah, saya tidak tahu entitas apa nilai target_id milik. Bisa berupa id node, id istilah, id pengguna. Tanpa info itu, saya tidak dapat menggunakan target_id untuk mendapatkan nama tag.

Bagaimana saya bisa mendapatkan semua nama bidang referensi entitas?

Jawaban:


20

Cara termudah untuk mendapatkan yang Anda inginkan adalah sesuatu seperti ini:

$names = [];
foreach ($node->field_tags as $item) {
  if ($item->entity) {
    $names[$item->entity->id()] = $item->entity->label();
  }
}

->entityadalah properti yang disebut komputer, tidak muncul di getValues(). Semua bidang referensi memilikinya.

Dan ya, lupakan print_r()entitas atau objek kompleks lainnya. Mereka berisi objek yang saling referensi, dan print_r()tidak bisa mengatasinya. Jika Anda memiliki entitas, selalu gunakan print_r($entity->toArray()), maka Anda hanya mendapatkan nilai bidang. Anda dapat menginstal modul devel atau menggunakan debugger, tetapi itu akan memberi Anda struktur internal suatu entitas, yang sebenarnya tidak ingin Anda lihat.


2
$node->toArray();tentu terlihat jauh lebih pendek & bersih daripada menggunakan\Drupal::service('entity_field.manager')->getFieldDefinitions('node', 'article');
No Sssweat

Di mana Anda menemukan dokumentasi tentang ini?
AlxVallejo

Anda dapat menemukan beberapa informasi di sini misalnya: drupal.org/docs/8/api/entity-api
Berdir

@Berdir: print_r($entity->toArray())Ini memecahkan masalah ini. Saya bisa mendapatkan semua detail bidang. Terima kasih banyak.
kalidasan

@Berdir dapatkah Anda lebih spesifik tentang dokumentasi? Saya telah mencari-cari di halaman itu tetapi tidak melihat contoh spesifik yang terkait dengan bidang referensi istilah.
Keven

6

Bidang referensi entitas, menurut definisi, hanya dapat menargetkan satu tipe entitas sehingga Anda dapat mengetahui apa tipe target Anda dengan memanggil getSetting()definisi bidang.

// Print the targeted entity type field.
$field = \Drupal\field\Entity\FieldStorageConfig::loadByName('node','field_tags');
echo $field->getSetting('target_type');

Atau lebih baik lagi, gunakan EntityReferenceFieldItemList::referencedEntities()untuk menarik entitas yang dirujuk simpul dan data terkait yang Anda butuhkan.

// Return an array of Entity objects referenced in the field.
$node->field_tags->referencedEntities();

print_r($node->field_tag->referencedEntities());tampaknya menjadi sumber daya babi, saya telah meningkatkan contoh AWS saya , hanya untuk dapat melakukannya, karena saya terus mendapatkan WSOD.
No Sssweat

Beri tahu saya jika ini harus menjadi pertanyaan terpisah. Bagaimana saya bisa mengakses nilai nama, ketika dalam array dikatakan nilai: protected yang berarti hanya bisa diakses di dalam kelas.
No Sssweat

Saya merasa tidak enak karena tidak menerima jawaban Anda, tetapi jawaban @Berdir tidak memberi saya pilihan lain selain melakukannya. Saya tidak pernah menemukan cara untuk mendapatkan nilai menggunakan Or better yetmetode Anda . Metode pertama baik, tetapi akan membutuhkan pernyataan jika memeriksa jenis target dan kemudian mendapatkan nilainya. Jawaban Berdir lebih efisien karena tidak perlu diperiksa.
No Sssweat

1
Jangan berkeringat (... pun intended). Versi pertama pertanyaan Anda tidak terlalu jelas tentang tujuan Anda. Anda harus menandai jawaban yang paling cocok.
Shawn Conn

Saya benar-benar berharap jawaban ini tidak terkubur dalam pos SO ini. Saya ingin mendapatkan target_typenilai dari entity_referencebidang dan mencari tinggi dan rendah untuk itu ... sampai Anda menjawab pertanyaan saya di sini.
Keven
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.