Sammlungen (Collections)

Bei der Entwicklung von NocoBase-Plugins ist die Sammlung (Collection) eines der zentralen Konzepte. Sie können die Struktur von Datentabellen in Ihren Plugins hinzufügen oder ändern, indem Sie Sammlungen definieren oder erweitern. Im Gegensatz zu Datentabellen, die über die Oberfläche der Datenquellenverwaltung erstellt werden, handelt es sich bei im Code definierten Sammlungen in der Regel um Metadatentabellen auf Systemebene, die nicht in der Liste der Datenquellenverwaltung erscheinen.

Datentabellen definieren

Gemäß der konventionellen Verzeichnisstruktur sollten Sammlungsdateien im Verzeichnis ./src/server/collections abgelegt werden. Verwenden Sie defineCollection(), um neue Tabellen zu erstellen, und extendCollection(), um bestehende Tabellen zu erweitern.

import { defineCollection } from '@nocobase/database';

export default defineCollection({
  name: 'articles',
  title: 'Beispielartikel',
  fields: [
    { type: 'string', name: 'title', interface: 'input', uiSchema: { title: 'Titel', required: true } },
    { type: 'text', name: 'content', interface: 'textarea', uiSchema: { title: 'Inhalt' } },
    {
      type: 'belongsTo',
      name: 'author',
      target: 'users',
      foreignKey: 'authorId',
      interface: 'recordPicker',
      uiSchema: { title: 'Autor' },
    },
  ],
});

Im obigen Beispiel:

  • name: Der Tabellenname (eine Tabelle mit demselben Namen wird automatisch in der Datenbank generiert).
  • title: Der Anzeigename der Tabelle in der Benutzeroberfläche.
  • fields: Eine Sammlung von Feldern, wobei jedes Feld Attribute wie type, name usw. enthält.

Wenn Sie Felder hinzufügen oder Konfigurationen für Sammlungen anderer Plugins ändern müssen, können Sie extendCollection() verwenden:

import { extendCollection } from '@nocobase/database';

export default extendCollection({
  name: 'articles',
  fields: [
    {
      type: 'boolean',
      name: 'isPublished',
      defaultValue: false,
    },
  ],
});

Nach der Aktivierung des Plugins fügt das System das Feld isPublished automatisch der bestehenden articles-Tabelle hinzu.

Tip

Die konventionelle Verzeichnisstruktur wird geladen, bevor die load()-Methoden aller Plugins ausgeführt werden. Dadurch werden Abhängigkeitsprobleme vermieden, die durch nicht geladene Datentabellen entstehen könnten.

Feldtypen im Überblick

In den fields von defineCollection bestimmt type den Spaltentyp des Feldes in der Datenbank. Nachfolgend finden Sie alle integrierten Feldtypen:

Text

typeDatenbanktypBeschreibungSpezifische Parameter
stringVARCHAR(255)Kurzer Textlength?: number (benutzerdefinierte Länge), trim?: boolean
textTEXTLanger Textlength?: 'tiny' | 'medium' | 'long' (nur MySQL)

Zahlen

typeDatenbanktypBeschreibungSpezifische Parameter
integerINTEGERGanzzahl
bigIntBIGINTGroße Ganzzahl
floatFLOATGleitkommazahl
doubleDOUBLEGleitkommazahl mit doppelter Genauigkeit
decimalDECIMAL(p,s)Festkommazahlprecision: number, scale: number

Boolesche Werte

typeDatenbanktypBeschreibung
booleanBOOLEANBoolescher Wert

Datum und Uhrzeit

typeDatenbanktypBeschreibungSpezifische Parameter
dateDATE(3)Datum und Uhrzeit (mit Millisekunden)defaultToCurrentTime?, onUpdateToCurrentTime?
dateOnlyDATEONLYNur Datum, ohne Uhrzeit
timeTIMENur Uhrzeit
unixTimestampBIGINTUnix-Zeitstempelaccuracy?: 'second' | 'millisecond'
Tip

date ist der am häufigsten verwendete Datumstyp. Wenn Sie zwischen verschiedenen Arten der Zeitzonenbehandlung unterscheiden müssen, stehen zusätzlich datetimeTz (mit Zeitzone) und datetimeNoTz (ohne Zeitzone) zur Verfügung.

Strukturierte Daten

typeDatenbanktypBeschreibungSpezifische Parameter
jsonJSON / JSONBJSON-Datenjsonb?: boolean (verwendet unter PostgreSQL JSONB)
jsonbJSONB / JSONBevorzugt JSONB
arrayARRAY / JSONArrayUnter PostgreSQL steht der native ARRAY-Typ zur Verfügung

ID-Generierung

typeDatenbanktypBeschreibungSpezifische Parameter
uidVARCHAR(255)Automatisch generierte kurze IDprefix?: string
uuidUUIDUUID v4autoFill?: boolean (Standard: true)
nanoidVARCHAR(255)NanoIDsize?: number (Standard: 12), customAlphabet?: string
snowflakeIdBIGINTSnowflake-IDautoFill?: boolean (Standard: true)

Spezielle Typen

typeDatenbanktypBeschreibung
passwordVARCHAR(255)Speicherung als automatisch gesalzener Hash
virtualKeine reale SpalteVirtuelles Feld, für das in der Datenbank keine Spalte angelegt wird
contextKonfigurierbarWird automatisch aus dem Anfragekontext befüllt (zum Beispiel currentUser.id)

Beziehungstypen

Beziehungsfelder legen keine Datenbankspalten an, sondern stellen Beziehungen zwischen Tabellen auf ORM-Ebene her:

typeBeschreibungWichtige Parameter
belongsToViele-zu-einstarget (Zieltabelle), foreignKey (Fremdschlüsselfeld)
hasOneEins-zu-einstarget, foreignKey
hasManyEins-zu-vieletarget, foreignKey
belongsToManyViele-zu-vieletarget, through (Zwischentabelle), foreignKey, otherKey

Anwendungsbeispiel für Beziehungsfelder:

export default defineCollection({
  name: 'articles',
  fields: [
    { type: 'string', name: 'title' },
    // Viele-zu-eins: Ein Artikel gehört zu einem Autor
    {
      type: 'belongsTo',
      name: 'author',
      target: 'users',
      foreignKey: 'authorId',
    },
    // Eins-zu-viele: Ein Artikel hat mehrere Kommentare
    {
      type: 'hasMany',
      name: 'comments',
      target: 'comments',
      foreignKey: 'articleId',
    },
    // Viele-zu-viele: Ein Artikel hat mehrere Tags
    {
      type: 'belongsToMany',
      name: 'tags',
      target: 'tags',
      through: 'articlesTags',  // Name der Zwischentabelle
    },
  ],
});

Gemeinsame Parameter

Alle Spaltenfelder unterstützen die folgenden Parameter:

ParameterTypBeschreibung
namestringFeldname (erforderlich)
defaultValueanyStandardwert
allowNullbooleanOb null zulässig ist
uniquebooleanOb der Wert eindeutig sein muss
primaryKeybooleanOb es sich um den Primärschlüssel handelt
autoIncrementbooleanOb der Wert automatisch hochgezählt wird
indexbooleanOb ein Index angelegt wird
commentstringFeldkommentar

Datenbankstruktur synchronisieren

Wenn ein Plugin zum ersten Mal aktiviert wird, synchronisiert das System automatisch die Sammlungs-Konfigurationen mit der Datenbankstruktur. Ist das Plugin bereits installiert und in Betrieb, müssen Sie nach dem Hinzufügen oder Ändern von Sammlungen den Upgrade-Befehl manuell ausführen:

yarn nocobase upgrade

Eine Sammlung in der Datentabellenliste der Oberfläche anzeigen

Über defineCollection definierte Tabellen sind serverseitige interne Tabellen und erscheinen standardmäßig nicht in der Liste der Datenquellenverwaltung und ebenso wenig in der Datentabellenauswahl beim Hinzufügen eines Blocks.

Empfohlenes Vorgehen: Legen Sie die entsprechende Datentabelle in der NocoBase-Oberfläche unter „Datenquellenverwaltung“ an. Sobald Sie Felder und Interface-Typen konfiguriert haben, erscheint die Tabelle automatisch in der Datentabellenauswahl des Blocks.

Beim Hinzufügen eines Blocks auswählbar

Falls die Registrierung tatsächlich im Plugin-Code erfolgen muss (etwa für Demonstrationsszenarien in Beispiel-Plugins), können Sie sie im clientseitigen Plugin manuell über addCollection vornehmen. Beachten Sie, dass die Registrierung zwingend über das eventBus-Muster erfolgen muss und nicht direkt in load() aufgerufen werden darf – ensureLoaded() leert nach load() alle Sammlungen und setzt sie neu. Ein vollständiges Beispiel finden Sie unter Ein Frontend-Backend-Datenmanagement-Plugin erstellen.

Ressourcen automatisch generieren

Nachdem Sie eine Sammlung definiert haben, generiert das System automatisch eine entsprechende Ressource. Auf dieser Ressource können Sie dann direkt CRUD-Operationen (Erstellen, Lesen, Aktualisieren, Löschen) über die API ausführen. Weitere Informationen finden Sie unter Ressourcenverwaltung.