Felder API vs. Felder in hook_schema

7

Kann jemand bitte erklären, welchen Vorteil die Verwendung der Fields-API zum Erstellen von Feldern für eine Entität hat, anstatt sie nur in hook_schema als Werte zu deklarieren?

Es ist ein bisschen Arbeit, alle Felder, Instanzen, Optionen, zulässigen und Standardwerte usw. zu definieren, und dann müssen Sie sich mit Gettern und Setzern befassen, und schließlich ist die Deinstallation nicht so einfach wie db_delete, insbesondere wenn Sie Referenzfelder haben in Verwendung durch andere Entitäten.

Wille
quelle

Antworten:

7

Der wichtigste Vorteil der Verwendung von Feldern anstelle von benutzerdefinierten Daten in einer benutzerdefinierten Tabelle besteht darin, dass Ihre Daten sofort in den Rest des Systems integriert werden. einschließlich (aber in keiner Weise beschränkt auf):

  • Automatische Integration mit Ansichten
  • Verwendungspotential EntityFieldQuerys
  • Felder können mit der Standard-Systembenutzeroberfläche verwaltet werden, auch wenn sie Code enthalten
  • Automatische Integration mit Funktionen
  • Es gibt viele Widgets, die die Benutzeroberfläche eines Felds verbessern können (z. B. das Widget "Term Reference Tree")
  • Sie müssen Ihre benutzerdefinierten Daten nicht in einem Load-Hook auf den Knoten / die Entität laden. Das Kernfeldsystem erledigt dies für Sie
  • Sie müssen keine CRUD-Operationen für Ihre Daten definieren

Ich bin sicher, es gibt viele, viele mehr.

Wenn Sie eine differenzierte Kontrolle über den Betrieb / die Leistung Ihrer zusätzlichen Daten wünschen, verwenden Sie grundsätzlich eine benutzerdefinierte Tabelle. Wenn Sie möchten, dass das System all das für Sie erledigt, verwenden Sie ein Feld. Für das, was es wert ist, verwende ich heutzutage so ziemlich immer ein Feld, um Entitätsdaten zu speichern.

Clive
quelle
1
sehr schön danke. Vielleicht ist eine bessere Frage, was der Grund für die Verwendung von Feldern ist, wenn Sie nur das Entity-API-Modul ( drupal.org/project/entity ) und hook_schema und hook_entity_info verwenden können, um Felder und CRUD abzurufen. Abgesehen von Ansichten und der Darstellung der Systembenutzeroberfläche kann ich anscheinend nicht alle Unterschiede in den Griff bekommen.
Will
2

Wie im Kommentar zu Clives Antwort erwähnt, werden die meisten Punkte von Clive ungültig, wenn eine benutzerdefinierte Entität auf den Controllern der Entity-API erstellt wird. Sie erhalten CRUD, Entitätseigenschaften *, Sie können Ihre Entität einfach exportierbar machen, EFQ-Unterstützung und sogar die Integration von Ansichten kostenlos. Und Sie haben eine bessere Leistung, da sich Ihre Daten in einer einzigen Tabelle befinden und Sie die Felddefinitionen nicht herumtragen müssen.

Die Verwendung von Feldern bietet jedoch noch einige Vorteile:

  • Felder unterstützen mehrere Werte für jeden Feldtyp.
  • Sie können Werte für verschiedene Sprachen speichern und erhalten dafür mit dem Entity-Übersetzungsmodul eine Benutzeroberfläche.
  • Die Feld-Benutzeroberfläche, mit der Sie Ihrer Entität zusätzliche Felder hinzufügen können. Für eine wiederverwendbare Entität möchten Sie sie möglicherweise auch dann feldfähig machen, wenn Sie selbst keine Felder hinzufügen.

  • Wird basierend auf dem Schema generiert, daher müssen Sie sie wahrscheinlich ein wenig optimieren und den richtigen Typ hinzufügen (Boolescher Wert, Datum anstelle von int usw.).

Berdir
quelle
0

Berdir und Clive haben vollkommen recht.

In der Praxis habe ich nur einen Grund gefunden, keine Felder zu verwenden: Datenbankleistung. Jedes Schreiben / Aktualisieren eines Feldes verursacht zwei INSERT-Anweisungen. Wenn Sie 50 Felder haben und einen node_save () ausführen, werden 100 INSERTs ausgelöst.

Bitte beachten Sie, dass dies nicht wichtig ist, wenn Sie einige tausend Knoten haben und einige Male pro Stunde darauf schreiben. Das Aktualisieren von 10 Millionen Knoten in einem Stapel ist jedoch eine andere Geschichte. In solchen Situationen sollten Sie an eine benutzerdefinierte Entität denken, die auf den Controllern der Entity-API basiert, wie von berdir erwähnt, oder sich einen alternativen Speicher wie MongoDB ansehen .

BetaRide
quelle