Es gibt zwei Möglichkeiten, um Werte von Entitäten abzurufen:
- Verwenden Sie
field_get_items
und erhalten Sie den Wert eines Feldes - Verwenden Sie
entity_metadata_wrapper
und erhalten Sie den Wert eines Feldes
Obwohl entity_metadata_wrapper
die Sprachunterschiede abstrahiert werden, ist die API manchmal immer noch umständlich, insbesondere bei Verwendung von PHP 5.3. Wenn Sie beispielsweise den Wert eines Langtextfelds abrufen, gehen Sie normalerweise folgendermaßen vor:
$field = $wrapper->field->value();
print $field['safe_value'];
Glücklicherweise unterstützt PHP 5.4 diese Syntax : print $wrapper->field->value()['safe_value'];
.
Aber meine Frage ist mehr über die Leistung besorgt. Wie arbeiten beide? Fragen sie die Datenbank jedes Mal ab, wenn sie einen Wert anfordern? Fordert entity_metadata_wrapper
alles auf einmal an? (Besser field_get_item
geeignet für Einzelwertabfragen.)
Ich bin nicht mutig genug, tief in die Drupal-Quelle einzutauchen.
performance
entities
Florian Margaine
quelle
quelle
field_view_field()
dient zum Rendern eines Feldes. Die Funktion zum Abrufen des Werts eines Feldes lautet field_get_items () .field_get_items()
verursacht keinen Datenbank-Overhead, also denke ich, dass dies ein ziemlich offener und geschlossener Fall ist :)field_get_items()
kein Datenbank-Overhead entsteht? Es muss seine Daten irgendwo bekommen, oder?entity_metadata_wrapper
die Leistung funktioniert.field_get_items()
sodass der Overhead bereits angefallen ist ... um ehrlich zu sein, ist es in D7 eine etwas erdrosselte RouteAntworten:
Die kurze Antwort: field_get_items () ist performanter als entity_metadata_wrapper ().
Überprüfen Sie den Code für diese Funktionen:
Für beide ist es erforderlich, dass Sie die Entität weitergeben, die bereits aus der Datenbank geladen wurde . Beispielsweise:
oder, wie Sie bereits vorgeschlagen haben:
Diese beiden Fälle stören mich irgendwie wegen der dummen Logik beim Versuch, einen Wert zu erhalten, der Ihnen bereits zur Verfügung steht, aber sie sind sicherlich in vielen Fällen nützlich.
Sie könnten dies einfach tun,
print $node->field_my_field_name[LANGUAGE_NONE][0]['value'];
aber das würde PHP-Benachrichtigungsfehler auslösen, wenn das Feld keinen Wert hat, da Sie versuchen, auf Arrays zuzugreifen, die möglicherweise nicht vorhanden sind (dh[LANGUAGE_NONE][0]['value']
). Ich mache das in letzter Zeit ziemlich oft:Das ist viel sauberer als zu tun:
Wenn Sie sich den Code
field_get_items())
ansehen, werden Sie feststellen, dass er nichts weiter tut, als sicherzustellen, dass das Array des Felds Daten in der aktuellen Sprache enthält, und diese dann zurückgibt. Der Aufwand für die Ausführung einer so kleinen Funktion ist also vernachlässigbar. Wenn Sie sich jedoch wirklich mit der Leistung befassen, können Sie einfach selbst prüfen, ob die Daten vorhanden sind, und sie dann ausdrucken.Bearbeiten: Da
field_get_items()
Läufefield_language()
tatsächlich einen größeren Leistungseinbruch bedeuten würden, als nur die Sprache zu überprüfen. Wenn Sie also bereits wissen, dass $ entity-> language existiert, können Sie einfach Ihre eigene super-performante Funktion schreiben:quelle
$node = node_load(123);
in einem Skript tun und an anderer Stelle erneut ausführen, entsteht kein Leistungsaufwand für das vollständige Laden und Erstellen von Objekten. Drupal weist dieser Variablen lediglich eine Kopie der vorhandenen Entität zu. Wenn Sie eine neue Kopie laden möchten , müssen Sie diese$reset = TRUE
an die Entitätsladefunktion übergeben. Siehe auch meine Änderungen in Bezug auf einen super performanten Getter.if (isset($node->field_my_field_name[LANGUAGE_NONE]) && isset($node->field_my_field_name[LANGUAGE_NONE][0])) {
ist nicht notwendig,isset($node->field_my_field_name[LANGUAGE_NONE][0]
ist genug.isset($node->field_my_field_name[LANGUAGE_NONE])
, da die Sprache nicht auf ein leeres Feld gesetzt wird? Ich denke, es ist das Delta[0]
, das überflüssig ist.