以编程方式更新实体参考字段


23

我知道我可以使用类似于以下代码的方式在Drupal 7中更新(或为其设置值)。

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

我想以编程方式为Drupal 8中的用户实体引用字段设置一个值。

我尝试过$node->field_code_used_by->setValue(1);$node->field_code_used_by->entity->value = 1;但他们都不起作用。

如何设置实体参考字段的值?

Answers:


31

您需要使用类似于以下的代码。

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

对于多值字段,要将值添加到列表的末尾,请使用以下代码。

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

另一种方法是entity使用实体对象设置属性,如以下代码所示。

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

2
除非父节点已经存在,否则这似乎不起作用。将target_id或实体属性分配给未保存的新父节点时,不会保存该关系。(在分配给NULL实体ref字段时,也可能不起作用,但我尚未对此进行测试。)有人知道如何解决这种情况吗?
aaronbauman

@aaronbauman您有解决方案吗?
回声

@echo我不记得我如何或是否解决了这个问题。如果我对行为的描述是准确的,那是一个错误。如果drupal.org上没有公开的问题,那么应该有
aaronbauman

@aaronbauman drupal.org/project/paragraphs/issues/2707017#comment-11872624帮助我使用了新节点。因此,这似乎不是一个错误。
回声

11

像D7中一样,D8中参考字段的主要属性仍然是target id

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

entity属性是一个计算值。如果将对象放入此值,则drupal会将其转换回id,然后再将其保存到dababase。

多值字段

将项目添加到多值字段:

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

该属性target_id不是必需的,因为它是main属性,默认情况下使用。因此,对于大多数字段,您可以在一个简单的php数组中添加一个值,该值很容易记住:

$node->field_code_used_by[] = $user_id;

允许多个值的实体引用字段怎么样?
布赖恩
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.