logologo
Начало
Руководство
Разработка
Плагины
API
Главная
English
简体中文
日本語
한국어
Español
Português
Deutsch
Français
Русский
Начало
Руководство
Разработка
Плагины
API
Главная
logologo
Обзор API

@nocobase/auth

AuthManager
Auth
BaseAuth

@nocobase/cache

CacheManager
Кэш

@nocobase/cli

NocoBase CLI
Глобальные переменные окружения

@nocobase/client

Приложение
Плагин

@nocobase/database

Коллекция
Поле

interfaces

BaseInterface
Операторы фильтрации

RelationRepository

BelongsToManyRepository
belongs-to-repository
HasManyRepository
HasOneRepository
Репозиторий

shared

create-options
destroy-options
find-one
find-options
transaction
update-options

@nocobase/data-source-manager

DataSourceManager
DataSource (абстрактный)
ICollectionManager
ICollection
IField
IModel
IRepository

@nocobase/flow-engine

Менеджер источников данных
Контекст потока
FlowEngine
Модель потока
Ресурс рабочего процесса

@nocobase/logger

Логгер

@nocobase/server

AppCommand
Приложение
AuditManager
Контекст
Миграция
Плагин

@nocobase/sdk

Auth
Storage
Previous PageHasOneRepository
Next Pageshared
Уведомление о переводе ИИ

Эта документация была автоматически переведена ИИ.

#Репозиторий

#Обзор

Для заданного объекта Collection вы можете получить его объект Repository для выполнения операций чтения и записи данных в коллекции.

const { UserCollection } = require('./collections');

const UserRepository = UserCollection.repository;

const user = await UserRepository.findOne({
  filter: {
    id: 1,
  },
});

user.name = 'new name';
await user.save();

#Запросы

#Базовые запросы

В объекте Repository вы можете вызывать методы, начинающиеся с find*, для выполнения операций запроса. Все методы запроса поддерживают передачу параметра filter для фильтрации данных.

// SELECT * FROM users WHERE id = 1
userRepository.find({
  filter: {
    id: 1,
  },
});

#Операторы

Параметр filter в Repository также предоставляет различные операторы для выполнения более разнообразных операций запроса.

// SELECT * FROM users WHERE age > 18
userRepository.find({
  filter: {
    age: {
      $gt: 18,
    },
  },
});

// SELECT * FROM users WHERE age > 18 OR name LIKE '%张%'
userRepository.find({
  filter: {
    $or: [{ age: { $gt: 18 } }, { name: { $like: '%张%' } }],
  },
});

Более подробную информацию об операторах см. в разделе Операторы фильтрации.

#Управление полями

При выполнении операции запроса вы можете управлять выходными полями с помощью параметров fields, except и appends.

  • fields: Указывает выходные поля
  • except: Исключает выходные поля
  • appends: Добавляет связанные поля в вывод
// Результат будет содержать только поля id и name
userRepository.find({
  fields: ['id', 'name'],
});

// Результат не будет содержать поле password
userRepository.find({
  except: ['password'],
});

// Результат будет содержать данные из связанного объекта posts
userRepository.find({
  appends: ['posts'],
});

#Запросы по связанным полям

Параметр filter поддерживает фильтрацию по связанным полям, например:

// Запрос объектов user, чьи связанные posts содержат объект с заголовком 'post title'
userRepository.find({
  filter: {
    'posts.title': 'post title',
  },
});

Связанные поля также могут быть вложенными.

// Запрос объектов user, где комментарии их постов содержат ключевые слова
await userRepository.find({
  filter: {
    'posts.comments.content': {
      $like: '%keywords%',
    },
  },
});

#Сортировка

Вы можете сортировать результаты запроса с помощью параметра sort.

// SELECT * FROM users ORDER BY age
await userRepository.find({
  sort: 'age',
});

// SELECT * FROM users ORDER BY age DESC
await userRepository.find({
  sort: '-age',
});

// SELECT * FROM users ORDER BY age DESC, name ASC
await userRepository.find({
  sort: ['-age', 'name'],
});

Вы также можете сортировать по полям связанных объектов.

await userRepository.find({
  sort: 'profile.createdAt',
});

#Создание

#Базовое создание

Создавайте новые объекты данных с помощью Repository.

await userRepository.create({
  name: '张三',
  age: 18,
});
// INSERT INTO users (name, age) VALUES ('张三', 18)

// Поддерживается массовое создание
await userRepository.create([
  {
    name: '张三',
    age: 18,
  },
  {
    name: '李四',
    age: 20,
  },
]);

#Создание связей

При создании вы можете одновременно создавать связанные объекты. Аналогично запросам, поддерживается также вложенное использование связанных объектов, например:

await userRepository.create({
  name: '张三',
  age: 18,
  posts: [
    {
      title: 'post title',
      content: 'post content',
      tags: [
        {
          name: 'tag1',
        },
        {
          name: 'tag2',
        },
      ],
    },
  ],
});
// При создании пользователя создается пост, связанный с пользователем, и теги, связанные с постом.

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

const tag1 = await tagRepository.findOne({
  filter: {
    name: 'tag1',
  },
});

await userRepository.create({
  name: '张三',
  age: 18,
  posts: [
    {
      title: 'post title',
      content: 'post content',
      tags: [
        {
          id: tag1.id, // Устанавливает связь с существующим связанным объектом
        },
        {
          name: 'tag2',
        },
      ],
    },
  ],
});

#Обновление

#Базовое обновление

Получив объект данных, вы можете напрямую изменять его свойства в объекте данных (Model), а затем вызвать метод save для сохранения изменений.

const user = await userRepository.findOne({
  filter: {
    name: '张三',
  },
});

user.age = 20;
await user.save();

Объект данных Model наследуется от Sequelize Model. Операции с Model см. в Sequelize Model.

Вы также можете обновлять данные через Repository:

// Изменяет записи данных, соответствующие условиям фильтрации
await userRepository.update({
  filter: {
    name: '张三',
  },
  values: {
    age: 20,
  },
});

При обновлении вы можете контролировать, какие поля обновляются, используя параметры whitelist и blacklist, например:

await userRepository.update({
  filter: {
    name: '张三',
  },
  values: {
    age: 20,
    name: '李四',
  },
  whitelist: ['age'], // Обновляет только поле age
});

#Обновление связанных полей

При обновлении вы можете устанавливать связанные объекты, например:

const tag1 = tagRepository.findOne({
  filter: {
    id: 1,
  },
});

await postRepository.update({
  filter: {
    id: 1,
  },
  values: {
    title: 'new post title',
    tags: [
      {
        id: tag1.id, // Устанавливает связь с tag1
      },
      {
        name: 'tag2', // Создает новый тег и устанавливает связь
      },
    ],
  },
});

await postRepository.update({
  filter: {
    id: 1,
  },
  values: {
    tags: null, // Отменяет связь поста с тегами
  },
});

#Удаление

Вы можете вызвать метод destroy() в Repository для выполнения операции удаления. При удалении необходимо указать условия фильтрации:

await userRepository.destroy({
  filter: {
    status: 'blocked',
  },
});

#Конструктор

Обычно не вызывается напрямую разработчиками. В основном он инстанцируется после регистрации типа через db.registerRepositories() и указания соответствующего зарегистрированного типа репозитория в параметрах db.collection().

Подпись

  • constructor(collection: Collection)

Пример

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

class MyRepository extends Repository {
  async myQuery(sql) {
    return this.database.sequelize.query(sql);
  }
}

db.registerRepositories({
  books: MyRepository,
});

db.collection({
  name: 'books',
  // here link to the registered repository
  repository: 'books',
});

await db.sync();

const books = db.getRepository('books') as MyRepository;
await books.myQuery('SELECT * FROM books;');

#Члены экземпляра

#database

Экземпляр управления базой данных контекста.

#collection

Соответствующий экземпляр управления коллекцией.

#model

Соответствующий класс модели данных.

#Методы экземпляра

#find()

Запрашивает набор данных из базы данных, позволяя указывать условия фильтрации, сортировку и т.д.

Подпись

  • async find(options?: FindOptions): Promise<Model[]>

Тип

type Filter = FilterWithOperator | FilterWithValue | FilterAnd | FilterOr;
type Appends = string[];
type Except = string[];
type Fields = string[];
type Sort = string[] | string;

interface SequelizeFindOptions {
  limit?: number;
  offset?: number;
}

interface FilterByTk {
  filterByTk?: TargetKey;
}

interface CommonFindOptions extends Transactionable {
  filter?: Filter;
  fields?: Fields;
  appends?: Appends;
  except?: Except;
  sort?: Sort;
}

type FindOptions = SequelizeFindOptions & CommonFindOptions & FilterByTk;

Подробности

#filter: Filter

Условие запроса, используемое для фильтрации результатов данных. В переданных параметрах запроса key — это имя поля для запроса, а value может быть значением для запроса или использоваться с операторами для другой условной фильтрации данных.

// Запрос записей, где name равно foo, а age больше 18
repository.find({
  filter: {
    name: 'foo',
    age: {
      $gt: 18,
    },
  },
});

Более подробную информацию об операторах см. в разделе Операторы запросов.

#filterByTk: TargetKey

Запрашивает данные по TargetKey, что является удобным методом для параметра filter. Конкретное поле для TargetKey может быть сконфигурировано в Collection, по умолчанию это primaryKey.

// По умолчанию находит запись с id = 1
repository.find({
  filterByTk: 1,
});

#fields: string[]

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

#except: string[]

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

#appends: string[]

Добавленные столбцы, используемые для загрузки связанных данных. После передачи этого параметра указанные связанные поля также будут выводиться.

#sort: string[] | string

Указывает метод сортировки результатов запроса. Параметр — это имя поля, которое по умолчанию сортируется по возрастанию (asc). Для сортировки по убыванию (desc) добавьте символ - перед именем поля, например: ['-id', 'name'], что означает сортировку по id desc, name asc.

#limit: number

Ограничивает количество результатов, аналогично limit в SQL.

#offset: number

Смещение запроса, аналогично offset в SQL.

Пример

const posts = db.getRepository('posts');

const results = await posts.find({
  filter: {
    createdAt: {
      $gt: '2022-01-01T00:00:00.000Z',
    },
  },
  fields: ['title'],
  appends: ['user'],
});

#findOne()

Запрашивает одну запись данных из базы данных, соответствующую определенным критериям. Эквивалентно Model.findOne() в Sequelize.

Подпись

  • async findOne(options?: FindOneOptions): Promise<Model | null>

Пример

const posts = db.getRepository('posts');

const result = await posts.findOne({
  filterByTk: 1,
});

#count()

Запрашивает общее количество записей данных из базы данных, соответствующих определенным критериям. Эквивалентно Model.count() в Sequelize.

Подпись

  • count(options?: CountOptions): Promise<number>

Тип

interface CountOptions
  extends Omit<SequelizeCountOptions, 'distinct' | 'where' | 'include'>,
    Transactionable {
  filter?: Filter;
}

Пример

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

const count = await books.count({
  filter: {
    title: '三字经',
  },
});

#findAndCount()

Запрашивает набор данных и общее количество результатов, соответствующих определенным критериям, из базы данных. Эквивалентно Model.findAndCountAll() в Sequelize.

Подпись

  • async findAndCount(options?: FindAndCountOptions): Promise<[Model[], number]>

Тип

type FindAndCountOptions = Omit<
  SequelizeAndCountOptions,
  'where' | 'include' | 'order'
> &
  CommonFindOptions;

Подробности

Параметры запроса такие же, как у find(). Возвращаемое значение — это массив, где первый элемент — результат запроса, а второй — общее количество результатов.

#create()

Вставляет новую запись в коллекцию. Эквивалентно Model.create() в Sequelize. Когда создаваемый объект данных содержит информацию о полях связей, соответствующие записи данных связей также будут созданы или обновлены.

Подпись

  • async create<M extends Model>(options: CreateOptions): Promise<M>

Пример

const posts = db.getRepository('posts');

const result = await posts.create({
  values: {
    title: 'NocoBase 1.0 发布日志',
    tags: [
      // При наличии значения первичного ключа связанной таблицы данные обновляются
      { id: 1 },
      // При отсутствии значения первичного ключа создаются новые данные
      { name: 'NocoBase' },
    ],
  },
});

#createMany()

Вставляет несколько новых записей в коллекцию. Эквивалентно многократному вызову метода create().

Подпись

  • createMany(options: CreateManyOptions): Promise<Model[]>

Тип

interface CreateManyOptions extends BulkCreateOptions {
  records: Values[];
}

Подробности

  • records: Массив объектов данных для создаваемых записей.
  • transaction: Объект транзакции. Если параметр транзакции не передан, метод автоматически создаст внутреннюю транзакцию.

Пример

const posts = db.getRepository('posts');

const results = await posts.createMany({
  records: [
    {
      title: 'NocoBase 1.0 发布日志',
      tags: [
        // При наличии значения первичного ключа связанной таблицы данные обновляются
        { id: 1 },
        // При отсутствии значения первичного ключа создаются новые данные
        { name: 'NocoBase' },
      ],
    },
    {
      title: 'NocoBase 1.1 发布日志',
      tags: [{ id: 1 }],
    },
  ],
});

#update()

Обновляет данные в коллекции. Эквивалентно Model.update() в Sequelize. Когда обновляемый объект данных содержит информацию о полях связей, соответствующие записи данных связей также будут созданы или обновлены.

Подпись

  • async update<M extends Model>(options: UpdateOptions): Promise<M>

Пример

const posts = db.getRepository('posts');

const result = await posts.update({
  filterByTk: 1,
  values: {
    title: 'NocoBase 1.0 发布日志',
    tags: [
      // При наличии значения первичного ключа связанной таблицы данные обновляются
      { id: 1 },
      // При отсутствии значения первичного ключа создаются новые данные
      { name: 'NocoBase' },
    ],
  },
});

#destroy()

Удаляет данные из коллекции. Эквивалентно Model.destroy() в Sequelize.

Подпись

  • async destroy(options?: TargetKey | TargetKey[] | DestroyOptions): Promise<number>

Тип

interface DestroyOptions extends SequelizeDestroyOptions {
  filter?: Filter;
  filterByTk?: TargetKey | TargetKey[];
  truncate?: boolean;
  context?: any;
}

Подробности

  • filter: Указывает условия фильтрации для удаляемых записей. Подробное использование Filter см. в методе find().
  • filterByTk: Указывает условия фильтрации для удаляемых записей по TargetKey.
  • truncate: Следует ли очищать данные коллекции, действует, если параметры filter или filterByTk не переданы.
  • transaction: Объект транзакции. Если параметр транзакции не передан, метод автоматически создаст внутреннюю транзакцию.