Программно обновить поле ссылки на объект


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;но ни один из них не работал.

Как я могу установить значение для поля ссылки на сущность?

Ответы:


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, у тебя есть какое-то решение?
эхо

@ эхо, я не помню, как или если я работал над этим. Если мое описание поведения точное, это ошибка. Если на 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 перед сохранением в базу данных.

Многозначные поля

Добавьте элемент в многозначное поле:

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

Это свойство target_idне является обязательным, поскольку оно является основным и используется по умолчанию. Таким образом, для большинства полей вы можете добавить значение, как в простом массиве php, которое легко запомнить:

$node->field_code_used_by[] = $user_id;

Как насчет полей ссылки на сущность, которые допускают несколько значений?
Брайан
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.