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.