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.