Varlık başvuru alanını programlı olarak güncelleştirme


23

Drupal 7'deki varlık başvuru alanını aşağıdakine benzer bir kodla güncelleyebilir (veya değerini ayarlayabilirim).

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

Programlı olarak Drupal 8'deki kullanıcı varlık referansım için bir değer belirlemek istiyorum.

Denedim $node->field_code_used_by->setValue(1);ve $node->field_code_used_by->entity->value = 1;ikisi de işe yaramadı.

Bir varlık referans alanı için değeri nasıl ayarlayabilirim?

Yanıtlar:


31

Aşağıdakine benzer bir kod kullanmanız gerekir.

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

Çok değerli bir alan için, listenin sonuna değer eklemek için aşağıdaki kodu kullanın.

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

Başka bir yol, entityözelliği aşağıdaki koddaki gibi varlık nesnesiyle ayarlamaktır .

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

2
Ana düğüm zaten mevcut değilse, bu iş görünmüyor. Target_id veya entity özelliğini yeni, kaydedilmemiş bir ana düğüme atadığınızda, ilişki kaydedilmez. (Muhtemelen NULL varlık ref alanına atanırken de çalışmaz, ancak bunu sınamamıştım.) Bu davayı nasıl ele alacağını bilen var mı?
aaronbauman

@ aaronbauman bunun için herhangi bir çözüm aldınız mı?
yankı

@ echo, nasıl çalıştığımı ya da bunun üzerinde çalıştığımı hatırlamıyorum. Eğer davranış tanımım doğruysa, bu bir hatadır.
Drupal.org'da

@aaronbauman drupal.org/project/paragraphs/issues/2707017#comment-11872624 bu düğümü yeni düğümle yapmama yardımcı oldu. Yani bir böcek gibi görünmüyor.
yankı

11

D7'de olduğu gibi, D8'deki bir referans alanının ana özelliği hala target id:

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

entityÖzelliği, hesaplanan bir değerdir. Bu değere bir nesne koyarsanız, drupal onu dababase'e kaydetmeden önce kimliğe geri çevirir.

Çok değerli alanlar

Çok değerli bir alana bir öğe ekleyin:

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

Özellik target_idgerekli değildir, çünkü ana özelliktir ve varsayılan olarak kullanılır. Bu yüzden çoğu alan için, basit bir php dizisindeki gibi, değerlerinin kolayca hatırlanabileceği bir değer ekleyebilirsiniz:

$node->field_code_used_by[] = $user_id;

Birden fazla değere izin veren varlık başvuru alanları için ne durumda?
Brian
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.