Actualizar mediante programación un campo de referencia de entidad


23

Sé que puedo actualizar (o establecer un valor para) un campo de referencia de entidad en Drupal 7 con un código similar al siguiente.

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

Quiero establecer programáticamente un valor para mi campo de referencia de entidad de usuario en Drupal 8.

Lo intenté $node->field_code_used_by->setValue(1);y $node->field_code_used_by->entity->value = 1;ninguno de los dos funcionó.

¿Cómo puedo establecer el valor para un campo de referencia de entidad?

Respuestas:


31

Necesita usar un código similar al siguiente.

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

Para un campo de valor múltiple, para agregar el valor al final de la lista, use el siguiente código.

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

Otra forma es establecer la entitypropiedad con el objeto de entidad, como en el siguiente código.

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

2
Esto no parece funcionar a menos que el nodo padre ya exista. Al asignar la propiedad target_id o entidad a un nuevo nodo padre no guardado, la relación no se guarda. (Posiblemente tampoco funciona cuando se asigna a un campo de referencia de entidad NULL, pero no lo he probado). ¿Alguien sabe cómo abordar este caso?
— aaronbauman

@aaronbauman, ¿tienes alguna solución?
— echo

@echo, no recuerdo cómo o si trabajé alrededor de esto. Si mi descripción del comportamiento es precisa, esto es un error. Si no hay un problema abierto en drupal.org para ello, debería
— haberlo

@aaronbauman drupal.org/project/paragraphs/issues/2707017#comment-11872624 me ayudó a hacer que eso funcione con un nuevo nodo. Entonces no parece ser un error.
— echo

11

Al igual que en D7, la propiedad principal de un campo de referencia en D8 sigue siendo target id:

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

La entitypropiedad es un valor calculado. Si coloca un objeto en este valor, drupal lo convertirá nuevamente a la identificación antes de guardarlo en la base de datos.

Campos de valores múltiples

Agregar un elemento a un campo de valores múltiples:

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

La propiedad target_idno es necesaria, porque es la propiedad principal y se usa de manera predeterminada. Entonces, para la mayoría de los campos, puede agregar un valor como en una matriz php simple, que es fácil de recordar:

$node->field_code_used_by[] = $user_id;

¿Qué tal para los campos de referencia de entidad que permiten múltiples valores?
— Brian
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.