Ich würde auf jeden Fall gehen field_attach_update
.
Die Idee ist einfach. Laden Sie einfach den Knoten und speichern Sie ihn mit field_attach_update.
Ex:
$node = node_load($nid);
$node->field_name[LANGUAGE_NONE][0]['value'] = 'New value';
field_attach_presave('node', $node);
field_attach_update('node', $node);
// Clear the static loading cache.
entity_get_controller('node')->resetCache(array($node->nid));
Dies ändert weder einen Zeitstempel noch einen anderen Hook, den node_save normalerweise aufruft. Das Laden des Knotens ruft auch einige Hooks auf, so dass es wahrscheinlich nicht so effizient ist.
Wenn Sie die NID haben und die Knotenstruktur sehr einfach ist, können Sie dies auch so tun:
$node = new stdClass();
$node->nid = $nid; // Enter the nid taken. Make sure it exists.
$node->type = 'article';
$node->field_name[LANGUAGE_NONE][0]['value'] = 'New value';
field_attach_presave('node', $node);
field_attach_update('node', $node);
// Clear the static loading cache.
entity_get_controller('node')->resetCache(array($node->nid));
Wie auch immer, wenn Sie versuchen, etwas anderes als Felder zu aktualisieren, funktioniert dies nicht (Kommentarstatus, Veröffentlichungsstatus usw.). Wenn Sie node_save verwenden, wird der Cache für den jeweiligen Knoten automatisch für verschiedene Methoden gelöscht, die wir zum Löschen mit 'entity_get_controller' benötigen.
Update:
Sie sollten anscheinend auch anrufen field_attach_presave()
, damit andere Module die Feldeingabe ordnungsgemäß verarbeiten. Das Dateimodul verwendet es beispielsweise, um den Dateistatus mithilfe dieses Hooks auf permanent zu setzen. Ich habe meine 2 obigen Beispiele aktualisiert.
field_attach_update
?node_save
zufield_attach_update
und vonEntityFieldQuery
zudb_query_range
war sehr lohnend. Von 3h Update auf 40 Minuten.Wenn Sie keine Felddaten speichern möchten, ohne dass die Standardereignisse und -aktionen ausgeführt werden, können Sie drupal_write_record verwenden .
Hier ist ein Beispiel zum Einfügen von Hello World in das Textfeld für einen Artikelknoten mit der ID 1.
Wenn Ihre Site mehrsprachig ist, möchten Sie 'en' oder die Sprache Ihres Inhalts anstelle von 'und' verwenden.
Wenn Sie eine Revision durchführen, müssen Sie darauf achten, die richtige Revisions-ID einzufügen, andernfalls können Sie einfach denselben Wert wie die entity_id einfügen.
Beachten Sie, wie diese Daten in zwei Tabellen field_data_ * und field_revision_ * eingefügt werden. Sie sollten in beide einfügen, um sicherzustellen, dass die Site wie gewünscht funktioniert.
Nachdem Sie dies ausgeführt haben, müssen Sie die Caches löschen, damit die Felder angezeigt werden, je nachdem, wie Ihr Caching eingerichtet ist.
quelle
Für ein einfaches Update wie dieses, bei dem viele Knoten aktualisiert werden müssen, verwende ich immer eine MySQL-Update-Anweisung. Ja, das Zwischenspeichern muss berücksichtigt werden, aber Sie können den Cache einfach leeren, nachdem Sie fertig sind, und alles ist in Ordnung. Natürlich müssen Sie mit der Datenstruktur vertraut sein, aber sie ist in Drupal 6 relativ einfach (obwohl in Drupal 7 entsetzlich).
quelle
Ich schlage
field_attach_update
auch und keine direkte SQL-Abfrage vor, da SQL das Node-Cache-Objekt nicht aktualisiert und Sie in Ihrem nächstennode_load
nicht den aktualisierten Feldwert laden, werden Sie den alten Wert ladenfield_attach_update
ist viel besser als direkte SQL-Abfrage.quelle
stdClass
Objekt zu erstellen, ohne ihn zu laden. Wissen Sie, was passieren kann, wenn ich versuche, den Knoten auf diese Weise zu aktualisieren, ohne alle Felder festzulegen? Werden diese mit Nullen oder Standardwerten überschrieben? Könnten diese durch den Update-Vorgang ignoriert werden?Nachdem ich alle Ansätze ausprobiert hatte, die in den anderen Antworten erwähnt wurden, kam es zu sehr langsamen Aktualisierungszeiten (ca. 7 Tage für 700.000 Knoten eines Knotentyps mit mehr als 20 Feldern), bis ich diesen Artikel fand: http://www.drupalonwindows.com/en/ blog / only-update-changed-fields-or-properties-entity-drupal .
Nachdem ich so etwas wie den folgenden Code in ein hook_update implementiert hatte, reduzierte ich die Aktualisierungszeit auf 2 Stunden, was ich für überschaubar halte.
quelle
Ich hatte sogar die gleiche Anforderung, ein Feld für alle Knoten eines bestimmten Inhaltstyps zu aktualisieren. Ich habe node_load_multiple und field_attach_update verwendet .
Ich ließ es durch die Puste laufen und es ging ziemlich schnell.
quelle
Haben Sie darüber nachgedacht, diese Aktualisierungen mit mySQL direkt in der Datenbank durchzuführen? Es ist wahrscheinlich der einfachste und schnellste Weg, um das zu erreichen, was Sie wollen.
Hier ist ein einfaches Beispiel. Sie können einen solchen Befehl auf der Registerkarte 'SQL' in phpMyAdmin ausführen. Stellen Sie sich vor, Sie haben einen Inhaltstyp namens Mitgliedsprofil. Darin befindet sich ein Feld mit der Bezeichnung "Art des Mitglieds" (z. B. Firma, Person, Organisation). Angenommen, Sie möchten alle Vorkommen für "UNTERNEHMEN" in "Unternehmen" aktualisieren. Der folgende Befehl erledigt genau das.
UPDATE content_type_member_profile SET
field_type_of_member_value
= 'firma' WHEREfield_type_of_member_value
= 'FIRMA';Check-out Erste Schritte mit MySQL
quelle