Atualizar programaticamente um campo de referência da entidade

23

Eu sei que posso atualizar (ou definir um valor para) um campo de referência de entidade no Drupal 7 com código semelhante ao seguinte.

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

Desejo definir programaticamente um valor para o meu campo de referência de entidade do usuário no Drupal 8.

Eu tentei com $node->field_code_used_by->setValue(1);e $node->field_code_used_by->entity->value = 1;mas nenhum deles funcionou.

Como posso definir o valor para um campo de referência da entidade?

Jdrupal
fonte

Respostas:

31

Você precisa usar um código semelhante ao seguinte.

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

Para um campo de valores múltiplos, para adicionar o valor ao final da lista, use o seguinte código.

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

Outra maneira é definir a entitypropriedade com o objeto de entidade, como no código a seguir.

    $node = Node::load($nid);
    $user = \Drupal\user\Entity\User::load(1);
    $node->field_code_used_by->entity = $user;
    $node->save();
Yusef
fonte
2
Parece não funcionar, a menos que o nó pai já exista. Ao atribuir a target_id ou a propriedade da entidade a um novo nó pai não salvo, o relacionamento não é salvo. (Possivelmente também não funciona ao atribuir a um campo de entidade NULL ref, mas ainda não testei isso.) Alguém sabe como resolver esse caso?
Aaronbauman 28/11
@aaronbauman você conseguiu alguma solução?
eco
@echo não me lembro como ou se eu trabalhei em torno disso. Se minha descrição do comportamento for precisa, isso é um bug. Se não houver um problema em aberto no drupal.org, deve haver
aaronbauman
@aaronbauman drupal.org/project/paragraphs/issues/2707017#comment-11872624 me ajudou a fazer esse trabalho com o novo nó. Portanto, não parece ser um bug.
echo
11

Como em D7, a propriedade principal de um campo de referência em D8 ainda é a target id:

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

A entitypropriedade é um valor calculado. Se você colocar um objeto nesse valor, o drupal o converterá novamente no ID antes de salvá-lo na dababase.

Campos de valores múltiplos

Adicione um item a um campo de vários valores:

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

A propriedade target_idnão é necessária, porque é a propriedade principal e usada por padrão. Portanto, para a maioria dos campos, você pode adicionar um valor como em uma matriz php simples, fácil de lembrar:

$node->field_code_used_by[] = $user_id;
4k4
fonte
E os campos de referência de entidade que permitem vários valores?
Brian