Field - Поле

Обзор

Класс управления полями коллекции (абстрактный класс). Это также базовый класс для всех типов полей. Любой другой тип поля реализуется путем наследования этого класса.

О том, как настроить поля, см. в разделе Расширение типов полей.

Конструктор

Разработчики обычно не вызывают его напрямую, а в основном через метод db.collection({ fields: [] }) в качестве прокси-записи.

Расширение поля в основном реализуется путем наследования абстрактного класса Field и его последующей регистрации в экземпляре базы данных.

Сигнатура

  • constructor(options: FieldOptions, context: FieldContext)

Параметры

ПараметрТипПо умолчаниюОписание
optionsFieldOptions-Объект конфигурации поля
options.namestring-Имя поля
options.typestring-Тип поля, соответствующий имени типа поля, зарегистрированного в базе данных
contextFieldContext-Объект контекста поля
context.databaseDatabase-Экземпляр базы данных
context.collectionCollection-Экземпляр коллекции

Свойства

name

Имя поля.

type

Тип поля.

dataType

Тип хранения базы данных полей.

options

Параметры конфигурации инициализации поля.

context

Объект контекста поля.

Методы настройки

on()

Метод определения ярлыка, основанный на событиях коллекции. Эквивалент db.on(this.collection.name + '.' + eventName, listener).

Обычно нет необходимости переопределять этот метод при наследовании.

Сигнатура

  • on(eventName: string, listener: (...args: any[]) => void)

Параметры

ПараметрТипПо умолчаниюОписание
eventNamestring-Название события
listener(...args: any[]) => void-Слушатель событий

off()

Метод удаления ярлыков, основанный на событиях сбора. Эквивалент db.off(this.collection.name + '.' + eventName, listener).

Обычно нет необходимости переопределять этот метод при наследовании.

Сигнатура

  • off(eventName: string, listener: (...args: any[]) => void)

Параметры

ПараметрТипПо умолчаниюОписание
eventNamestring-Название события
listener(...args: any[]) => void-Слушатель событий

bind()

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

При наследовании необходимо сначала вызвать соответствующий метод super.bind().

Сигнатура

  • bind()

unbind()

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

При наследовании необходимо сначала вызвать соответствующий метод super.unbind().

Сигнатура

  • unbind()

get()

Получает значение элемента конфигурации поля.

Сигнатура

  • get(key: string): any

Параметры

ПараметрТипПо умолчаниюОписание
keystring-Имя элемента конфигурации

Пример

const field = db.collection('users').getField('name');

// Получите значение элемента конфигурации имени поля, возвращает 'name'.
console.log(field.get('name'));

merge()

Объединяет значения элементов конфигурации поля.

Сигнатура

  • merge(options: { [key: string]: any }): void

Параметры

ПараметрТипПо умолчаниюОписание
options{ [key: string]: any }-Объект элемента конфигурации, который необходимо объединить

Пример

const field = db.collection('users').getField('name');

field.merge({
  // Добавить конфигурацию индекса
  index: true,
});

remove()

Удаляет поле из коллекции (только из памяти).

Пример

const books = db.getCollections('books');

books.getField('isbn').remove();

// действительно удалить из БД
await books.sync();

Методы базы данных

removeFromDb()

Удаляет поле из базы данных.

Сигнатура

  • removeFromDb(options?: Transactionable): Promise<void>

Параметры

ПараметрТипПо умолчаниюОписание
options.transaction?Transaction-Экземпляр транзакции

existsInDb()

Определяет, существует ли поле в базе данных.

Сигнатура

  • existsInDb(options?: Transactionable): Promise<boolean>

Параметры

ПараметрТипПо умолчаниюОписание
options.transaction?Transaction-Экземпляр транзакции

Список встроенных типов полей

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

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

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

'boolean'

Логический тип значения.

Пример

db.collection({
  name: 'books',
  fields: [
    {
      type: 'boolean',
      name: 'published',
    },
  ],
});

'integer'

Целочисленный тип (32-битный).

Пример

db.collection({
  name: 'books',
  fields: [
    {
      type: 'integer',
      name: 'pages',
    },
  ],
});

'bigInt'

Тип большого целого числа (64-разрядный).

Пример

db.collection({
  name: 'books',
  fields: [
    {
      type: 'bigInt',
      name: 'words',
    },
  ],
});

'double'

Тип двойной точности с плавающей запятой (64-разрядный).

Пример

db.collection({
  name: 'books',
  fields: [
    {
      type: 'double',
      name: 'price',
    },
  ],
});

'real'

Тип действительного числа (только для PG).

'decimal'

Десятичный тип числа.

'string'

Тип строки. Эквивалент типа VARCHAR в большинстве баз данных.

Пример

db.collection({
  name: 'books',
  fields: [
    {
      type: 'string',
      name: 'title',
    },
  ],
});

'text'

Тип текста. Эквивалент типа TEXT в большинстве баз данных.

Пример

db.collection({
  name: 'books',
  fields: [
    {
      type: 'text',
      name: 'content',
    },
  ],
});

'password'

Тип пароля (расширение NocoBase). Шифрует пароли на основе метода scrypt собственного криптопакета Node.js.

Пример

db.collection({
  name: 'users',
  fields: [
    {
      type: 'password',
      name: 'password',
      length: 64, // Длина, по умолчанию 64
      randomBytesSize: 8, // Случайная длина в байтах, по умолчанию 8
    },
  ],
});

Параметры

ПараметрТипПо умолчаниюОписание
lengthnumber64Длина символа
randomBytesSizenumber8Случайный размер в байтах

'date'

Тип даты.

'time'

Тип времени.

'array'

Тип массива (только для PG).

'json'

Тип JSON.

'jsonb'

Тип JSONB (только для PG, остальные будут совместимы как тип 'json').

'uuid'

Тип UUID.

'uid'

Тип UID (расширение NocoBase). Тип короткого случайного строкового идентификатора.

'formula'

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

Пример

db.collection({
  name: 'orders',
  fields: [
    {
      type: 'double',
      name: 'price',
    },
    {
      type: 'integer',
      name: 'quantity',
    },
    {
      type: 'formula',
      name: 'total',
      expression: 'price * quantity',
    },
  ],
});

'radio'

Тип радио (расширение NocoBase). Не более одной строки данных во всей коллекции может иметь значение этого поля как true; все остальные будут false или null.

Пример

Во всей системе только один пользователь отмечен как root. После того, как значение root любого другого пользователя будет изменено на true, все остальные записи с root как true будут изменены на false:

db.collection({
  name: 'users',
  fields: [
    {
      type: 'radio',
      name: 'root',
    },
  ],
});

'sort'

Тип сортировки (расширение NocoBase). Сортирует на основе целых чисел, автоматически генерирует новый порядковый номер для новых записей и меняет порядок порядковых номеров при перемещении данных.

Если в коллекции определена опция sortable, соответствующее поле также будет сгенерировано автоматически.

Пример

Сообщения можно сортировать по пользователю, которому они принадлежат:

db.collection({
  name: 'posts',
  fields: [
    {
      type: 'belongsTo',
      name: 'user',
    },
    {
      type: 'sort',
      name: 'priority',
      scopeKey: 'userId', // Сортировка данных, сгруппированных по одному и тому же значению userId.
    },
  ],
});

'virtual'

Виртуальный тип. Фактически не хранит данные, а используется только для специальных определений метода получения/установки.

'belongsTo'

Тип связи «многие к одному». Внешний ключ хранится в отдельной таблице, а не в hasOne/hasMany.

Пример

Любой пост принадлежит автору:

db.collection({
  name: 'posts',
  fields: [
    {
      type: 'belongsTo',
      name: 'author',
      target: 'users', // Если не настроено, по умолчанию в качестве имени коллекции используется форма множественного числа.
      foreignKey: 'authorId', // Если не настроено, по умолчанию используется формат `<name> + Id`.
      sourceKey: 'id', // Если не настроено, по умолчанию используется идентификатор целевой коллекции.
    },
  ],
});

'hasOne'

Тип связи «один к одному». Внешний ключ хранится в связанной коллекции, а не в коллекции ownTo.

Пример

У каждого пользователя есть профиль:

db.collection({
  name: 'users',
  fields: [
    {
      type: 'hasOne',
      name: 'profile',
      target: 'profiles', // Можно опустить
    },
  ],
});

'hasMany'

Тип связи «один ко многим». Внешний ключ хранится в связанной коллекции, а не в коллекции ownTo.

Пример

Любой пользователь может иметь несколько сообщений:

db.collection({
  name: 'users',
  fields: [
    {
      type: 'hasMany',
      name: 'posts',
      foreignKey: 'authorId',
      sourceKey: 'id',
    },
  ],
});

'belongsToMany'

Тип связи «многие ко многим». Использует сквозную коллекцию для хранения внешних ключей обеих сторон. Если существующая коллекция не указана как сквозная коллекция, сквозная коллекция будет создана автоматически.

Пример

У любого сообщения может быть несколько тегов, и любой тег можно добавить к нескольким сообщениям:

db.collection({
  name: 'posts',
  fields: [
    {
      type: 'belongsToMany',
      name: 'tags',
      target: 'tags', // Можно опустить, если имя одинаковое
      through: 'postsTags', // Сквозная коллекция будет создана автоматически, если она не настроена.
      foreignKey: 'postId', // Внешний ключ исходной коллекции в сквозной коллекции
      sourceKey: 'id', // Первичный ключ исходной коллекции
      otherKey: 'tagId', // Внешний ключ целевой коллекции в сквозной коллекции.
    },
  ],
});

db.collection({
  name: 'tags',
  fields: [
    {
      type: 'belongsToMany',
      name: 'posts',
      through: 'postsTags', // Одна и та же группа отношений указывает на одно и то же посредством сбора
    },
  ],
});