Коллекции

При разработке плагинов NocoBase коллекция (таблица данных) является одной из ключевых концепций. Вы можете добавлять или изменять структуры таблиц данных в плагинах, определяя или расширяя коллекции. В отличие от таблиц данных, созданных через интерфейс управления источниками данных, коллекции, определенные в коде, обычно представляют собой таблицы метаданных системного уровня и не отображаются в списке управления источниками данных.

Определение таблиц данных

Следуя стандартной структуре каталогов, файлы коллекций следует размещать в каталоге ./src/server/collections. Используйте defineCollection() для создания новых таблиц и extendCollection() для расширения существующих таблиц.

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

export default defineCollection({
  name: 'articles',
  title: 'Sample Articles',
  fields: [
    { type: 'string', name: 'title', interface: 'input', uiSchema: { title: 'Title', required: true } },
    { type: 'text', name: 'content', interface: 'textarea', uiSchema: { title: 'Content' } },
    {
      type: 'belongsTo',
      name: 'author',
      target: 'users',
      foreignKey: 'authorId',
      interface: 'recordPicker',
      uiSchema: { title: 'Author' },
    },
  ],
});

В примере выше:

  • name: Имя таблицы (в базе данных автоматически будет создана таблица с таким же именем).
  • title: отображаемое название таблицы в интерфейсе.
  • fields: набор полей; каждое поле содержит type, name и другие атрибуты.

Когда вам нужно добавить поля или изменить конфигурацию коллекций других плагинов, вы можете использовать extendCollection():

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

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

После активации плагина система автоматически добавит поле isPublished в существующую таблицу articles.

Tip

Обычный каталог завершит загрузку до того, как будут выполнены методы load() всех плагинов, что позволит избежать проблем с зависимостями, вызванных тем, что некоторые таблицы данных не загружаются.

Краткий справочник по типам полей

В fields метода defineCollection параметр type определяет тип колонки поля в базе данных. Ниже перечислены все встроенные типы полей:

Текст

typeТип в базе данныхОписаниеСпецифические параметры
stringVARCHAR(255)Короткий текстlength?: number (пользовательская длина), trim?: boolean
textTEXTДлинный текстlength?: 'tiny' | 'medium' | 'long' (только MySQL)

Числа

typeТип в базе данныхОписаниеСпецифические параметры
integerINTEGERЦелое число
bigIntBIGINTБольшое целое число
floatFLOATЧисло с плавающей точкой
doubleDOUBLEЧисло с плавающей точкой двойной точности
decimalDECIMAL(p,s)Число с фиксированной точкойprecision: number, scale: number

Логический тип

typeТип в базе данныхОписание
booleanBOOLEANЛогическое значение

Дата и время

typeТип в базе данныхОписаниеСпецифические параметры
dateDATE(3)Дата и время (с миллисекундами)defaultToCurrentTime?, onUpdateToCurrentTime?
dateOnlyDATEONLYТолько дата, без времени
timeTIMEТолько время
unixTimestampBIGINTМетка времени Unixaccuracy?: 'second' | 'millisecond'
Tip

date — наиболее часто используемый тип даты. Если необходимо различать способы обработки часовых поясов, доступны также datetimeTz (с часовым поясом) и datetimeNoTz (без часового пояса).

Структурированные данные

typeТип в базе данныхОписаниеСпецифические параметры
jsonJSON / JSONBДанные JSONjsonb?: boolean (использовать JSONB в PostgreSQL)
jsonbJSONB / JSONПриоритетное использование JSONB
arrayARRAY / JSONМассивВ PostgreSQL доступен нативный тип ARRAY

Генерация идентификаторов

typeТип в базе данныхОписаниеСпецифические параметры
uidVARCHAR(255)Автоматически генерируемый короткий идентификаторprefix?: string
uuidUUIDUUID v4autoFill?: boolean (по умолчанию true)
nanoidVARCHAR(255)NanoIDsize?: number (по умолчанию 12), customAlphabet?: string
snowflakeIdBIGINTИдентификатор SnowflakeautoFill?: boolean (по умолчанию true)

Специальные типы

typeТип в базе данныхОписание
passwordVARCHAR(255)Хранение в виде хеша с автоматически добавляемой солью
virtualНет реальной колонкиВиртуальное поле, для которого в базе данных не создаётся колонка
contextНастраиваетсяАвтоматически заполняется из контекста запроса (например, currentUser.id)

Типы связей

Поля связей не создают колонок в базе данных, а устанавливают связи между таблицами на уровне ORM:

typeОписаниеКлючевые параметры
belongsToМногие к одномуtarget (целевая таблица), foreignKey (поле внешнего ключа)
hasOneОдин к одномуtarget, foreignKey
hasManyОдин ко многимtarget, foreignKey
belongsToManyМногие ко многимtarget, through (промежуточная таблица), foreignKey, otherKey

Пример использования полей связей:

export default defineCollection({
  name: 'articles',
  fields: [
    { type: 'string', name: 'title' },
    // Многие к одному: статья принадлежит одному автору
    {
      type: 'belongsTo',
      name: 'author',
      target: 'users',
      foreignKey: 'authorId',
    },
    // Один ко многим: у статьи несколько комментариев
    {
      type: 'hasMany',
      name: 'comments',
      target: 'comments',
      foreignKey: 'articleId',
    },
    // Многие ко многим: у статьи несколько тегов
    {
      type: 'belongsToMany',
      name: 'tags',
      target: 'tags',
      through: 'articlesTags',  // имя промежуточной таблицы
    },
  ],
});

Общие параметры

Все поля-колонки поддерживают следующие параметры:

ПараметрТипОписание
namestringИмя поля (обязательно)
defaultValueanyЗначение по умолчанию
allowNullbooleanРазрешено ли значение null
uniquebooleanДолжно ли значение быть уникальным
primaryKeybooleanЯвляется ли поле первичным ключом
autoIncrementbooleanИспользуется ли автоинкремент
indexbooleanСоздавать ли индекс
commentstringКомментарий к полю

Синхронизация структуры базы данных

При первой активации плагина система автоматически синхронизирует конфигурацию коллекции со структурой базы данных. Если плагин уже установлен и запущен, после добавления или изменения коллекций необходимо вручную выполнить команду обновления:

yarn nocobase upgrade

Отображение коллекции в списке таблиц данных интерфейса

Таблицы, определённые через defineCollection, являются внутренними серверными таблицами и по умолчанию не отображаются в списке управления источниками данных, а также в списке выбора таблиц данных при добавлении блока.

Рекомендуемый подход: добавьте соответствующую таблицу данных в разделе «Управление источниками данных» интерфейса NocoBase. После настройки полей и типов интерфейса таблица автоматически появится в списке выбора таблиц данных блока.

Свою таблицу можно выбрать при добавлении блока

Если регистрацию действительно необходимо выполнить в коде плагина (например, для демонстрационных сценариев в плагинах-примерах), можно зарегистрировать коллекцию вручную через addCollection в клиентском плагине. Обратите внимание, что регистрация должна выполняться по шаблону eventBus и не может вызываться напрямую в load() — метод ensureLoaded() после load() очищает и заново устанавливает все коллекции. Полный пример см. в разделе Создание плагина управления данными с интеграцией фронтенда и бэкенда.

Автогенерация ресурсов

После определения коллекции система автоматически сгенерирует соответствующий ресурс, в котором вы сможете напрямую выполнять CRUD-операции через API. См. Менеджер ресурсов.

Связанные ссылки