Programowo zaktualizuj pole odniesienia encji

23

Wiem, że mogę zaktualizować (lub ustawić wartość) pole referencji encji w Drupal 7 za pomocą kodu podobnego do następującego.

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

Chcę programowo ustawić wartość dla mojego pola referencyjnego encji użytkownika w Drupal 8.

Starałem się $node->field_code_used_by->setValue(1);, a $node->field_code_used_by->entity->value = 1;jednak żaden z nich nie pracował.

Jak ustawić wartość w polu referencyjnym encji?

Jdrupal
źródło

Odpowiedzi:

31

Musisz użyć kodu podobnego do następującego.

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

W przypadku pola o wielu wartościach, aby dodać wartość na końcu listy, użyj następującego kodu.

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

Innym sposobem jest ustawienie entitywłaściwości za pomocą obiektu encji, jak w poniższym kodzie.

    $node = Node::load($nid);
    $user = \Drupal\user\Entity\User::load(1);
    $node->field_code_used_by->entity = $user;
    $node->save();
Yusef
źródło
2
Nie wydaje się to działać, chyba że węzeł nadrzędny już istnieje. Podczas przypisywania target_id lub właściwości encji do nowego, niezapisanego węzła nadrzędnego relacja nie jest zapisywana. (Być może również nie działa podczas przypisywania do pola referencyjnego encji NULL, ale tego nie przetestowałem.) Czy ktoś wie, jak rozwiązać ten przypadek?
aaronbauman
@aaronbauman, czy masz jakieś rozwiązanie?
echo
@echo Nie pamiętam, jak i czy pracowałem nad tym. Jeśli mój opis zachowania jest dokładny, jest to błąd. Jeśli nie ma otwartego problemu na drupal.org, powinno być
aaronbauman
@aaronbauman drupal.org/project/paragraphs/issues/2707017#comment-11872624 pomógł mi sprawić, że będzie działać z nowym węzłem. Więc to nie wydaje się być błędem.
echo
11

Podobnie jak w D7, główną właściwością pola referencyjnego w D8 jest nadal target id:

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

entityWłasność jest wartość wyliczona. Jeśli umieścisz obiekt w tej wartości, drupal przekonwertuje go z powrotem na identyfikator przed zapisaniem go w bazie danych.

Pola wielowartościowe

Dodaj element do pola wielowartościowego:

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

Właściwość target_idnie jest konieczna, ponieważ jest główną właściwością i jest używana domyślnie. Tak więc dla większości pól możesz dodać wartość jak w prostej tablicy php, którą łatwo zapamiętać:

$node->field_code_used_by[] = $user_id;
4k4
źródło
Co powiesz na pola odniesienia encji, które pozwalają na wiele wartości?
Brian