Programmgesteuertes Aktualisieren eines Entitätsreferenzfelds

23

Ich weiß, dass ich ein Entitätsreferenzfeld in Drupal 7 mit folgendem Code aktualisieren (oder einen Wert dafür festlegen) kann.

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

Ich möchte programmgesteuert einen Wert für mein Benutzerentitätsreferenzfeld in Drupal 8 festlegen.

Ich habe versucht , mit $node->field_code_used_by->setValue(1);und $node->field_code_used_by->entity->value = 1;aber keiner von ihnen arbeitete.

Wie kann ich den Wert für ein Entitätsreferenzfeld festlegen?

Jdrupal
quelle

Antworten:

31

Sie müssen Code verwenden, der dem folgenden ähnelt.

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

Verwenden Sie für ein Feld mit mehreren Werten den folgenden Code, um den Wert am Ende der Liste hinzuzufügen.

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

Eine andere Möglichkeit besteht darin, die entityEigenschaft wie im folgenden Code mit dem Entitätsobjekt festzulegen.

    $node = Node::load($nid);
    $user = \Drupal\user\Entity\User::load(1);
    $node->field_code_used_by->entity = $user;
    $node->save();
Yusef
quelle
2
Dies scheint nur zu funktionieren, wenn der übergeordnete Knoten bereits vorhanden ist. Wenn Sie die Eigenschaft target_id oder entity einem neuen, nicht gespeicherten übergeordneten Knoten zuweisen, wird die Beziehung nicht gespeichert. (Funktioniert möglicherweise auch nicht, wenn einem NULL-Entity-Ref-Feld zugewiesen wird, aber ich habe das nicht getestet.) Weiß jemand, wie man diesen Fall behandelt?
Aaronbauman
@aaronbauman hast du eine lösung dafür?
Echo
@echo Ich erinnere mich nicht, wie oder ob ich daran gearbeitet habe. Wenn meine Beschreibung des Verhaltens korrekt ist, ist dies ein Fehler. Wenn es auf drupal.org kein offenes Problem dafür gibt, sollte es sein
Aaronbauman
@aaronbauman drupal.org/project/paragraphs/issues/2707017#comment-11872624 hat mir geholfen, dass dies mit dem neuen Knoten funktioniert. Scheint also kein Bug zu sein.
Echo
11

Wie in D7 ist die Haupteigenschaft eines Referenzfeldes in D8 immer noch target id:

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

Die entityEigenschaft ist ein berechneter Wert. Wenn Sie ein Objekt in diesen Wert einfügen, konvertiert Drupal es zurück in die ID, bevor es in der Datenbank gespeichert wird.

Felder mit mehreren Werten

Hinzufügen eines Elements zu einem Feld mit mehreren Werten:

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

Die Eigenschaft target_idist nicht erforderlich, da sie die Haupteigenschaft ist und standardmäßig verwendet wird. Für die meisten Felder können Sie also einen Wert wie in einem einfachen PHP-Array hinzufügen, an den Sie sich leicht erinnern können:

$node->field_code_used_by[] = $user_id;
4k4
quelle
Wie wäre es mit Entity-Referenzfeldern, die mehrere Werte zulassen?
Brian