Secara terprogram memperbarui bidang referensi entitas


23

Saya tahu saya bisa memperbarui (atau menetapkan nilai untuk) bidang referensi entitas di Drupal 7 dengan kode yang mirip dengan berikut ini.

 $node['field_code_used_by'][LANGUAGE_NONE][0]['target_id'] = $id;

Saya ingin secara terprogram menetapkan nilai untuk bidang referensi entitas pengguna saya di Drupal 8.

Saya mencoba $node->field_code_used_by->setValue(1);dan $node->field_code_used_by->entity->value = 1;tetapi tidak satu pun dari mereka bekerja.

Bagaimana cara menetapkan nilai untuk bidang referensi entitas?

Jawaban:


31

Anda perlu menggunakan kode yang mirip dengan yang berikut ini.

    $node = Node::load($nid);     
    $node->field_code_used_by->target_id = $user_id;
    $node->save();

Untuk bidang multi-nilai, untuk menambahkan nilai ke akhir daftar, gunakan kode berikut.

$node->field_code_used_by[] = ['target_id' => $user_id];

Cara lain adalah mengatur entityproperti dengan objek entitas, seperti pada kode berikut.

    $node = Node::load($nid);
    $user = \Drupal\user\Entity\User::load(1);
    $node->field_code_used_by->entity = $user;
    $node->save();

2
Ini tampaknya tidak berfungsi kecuali simpul induk sudah ada. Saat menetapkan target_id atau properti entitas ke simpul induk baru yang belum disimpan, hubungannya tidak disimpan. (Mungkin juga tidak berfungsi ketika menetapkan ke bidang ref entitas NULL, tetapi saya belum mengujinya.) Adakah yang tahu bagaimana cara mengatasi kasus ini?
aaronbauman

@ aaronbauman apakah Anda punya solusi untuk itu?
Gema

@echo saya tidak ingat bagaimana atau jika saya mengatasi ini. Jika deskripsi perilaku saya akurat, ini adalah bug. Jika tidak ada masalah terbuka di drupal.org untuk itu, harus ada
aaronbauman

@aaronbauman drupal.org/project/paragraphs/issues/2707017#comment-11872624 membantu saya membuat itu bekerja dengan simpul baru. Jadi sepertinya bukan bug.
Gema

11

Seperti di D7, properti utama dari bidang referensi di D8 adalah target id:

$node->field_code_used_by->target_id = $user_id;

The entityproperti adalah nilai yang dihitung. Jika Anda meletakkan objek dalam nilai ini, drupal akan mengubahnya kembali ke id sebelum menyimpannya ke database.

Bidang multinilai

Tambahkan item ke bidang multinilai:

$node->field_code_used_by[] = ['target_id' => $user_id];

Properti target_idtidak perlu, karena itu adalah properti utama dan digunakan secara default. Jadi untuk sebagian besar bidang, Anda dapat menambahkan nilai seperti dalam array php sederhana, yang mudah diingat:

$node->field_code_used_by[] = $user_id;

Bagaimana dengan bidang referensi entitas yang memungkinkan beberapa nilai?
Brian
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.