Aggiornamento programmatico di un campo di riferimento dell'entità


23

So di poter aggiornare (o impostare un valore per) un campo di riferimento di entità in Drupal 7 con un codice simile al seguente.

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

Voglio impostare a livello di codice un valore per il campo di riferimento della mia entità utente in Drupal 8.

Ci ho provato $node->field_code_used_by->setValue(1);e $node->field_code_used_by->entity->value = 1;nessuno dei due ha funzionato.

Come posso impostare il valore per un campo di riferimento dell'entità?

Risposte:


31

È necessario utilizzare un codice simile al seguente.

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

Per un campo a più valori, per aggiungere il valore alla fine dell'elenco, utilizzare il codice seguente.

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

Un altro modo è impostare la entityproprietà con l'oggetto entità, come nel codice seguente.

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

2
Questo non sembra funzionare a meno che il nodo padre non esista già. Quando si assegna la proprietà target_id o entità a un nuovo nodo padre non salvato, la relazione non viene salvata. (Probabilmente non funziona anche quando si assegna a un campo ref dell'entità NULL, ma non l'ho verificato.) Qualcuno sa come affrontare questo caso?
aaronbauman,

@aaronbauman hai avuto qualche soluzione?
echo il

@echo non ricordo come o se ho lavorato intorno a questo. Se la mia descrizione del comportamento è accurata, questo è un bug. Se su drupal.org non esiste un problema aperto, dovrebbe esserci
aaronbauman il

@aaronbauman drupal.org/project/paragraphs/issues/2707017#comment-11872624 mi ha aiutato a farlo funzionare con un nuovo nodo. Quindi non sembra essere un bug.
eco il

11

Come in D7 la proprietà principale di un campo di riferimento in D8 è ancora la target id:

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

La entityproprietà è un valore calcolato. Se metti un oggetto in questo valore, drupal lo convertirà nuovamente nell'id prima di salvarlo nella dababase.

Campi multivalore

Aggiungi un elemento a un campo multivalore:

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

La proprietà target_idnon è necessaria, poiché è la proprietà principale e utilizzata per impostazione predefinita. Quindi per la maggior parte dei campi è possibile aggiungere un valore come in un semplice array php, che è facile da ricordare:

$node->field_code_used_by[] = $user_id;

Che ne dite di campi di riferimento entità che consentono più valori?
Brian,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.