logologo
시작
가이드
개발
플러그인
API
홈
English
简体中文
日本語
한국어
Español
Português
Deutsch
Français
Русский
Italiano
Türkçe
Українська
Tiếng Việt
Bahasa Indonesia
ไทย
Polski
Nederlands
Čeština
العربية
עברית
हिन्दी
Svenska
시작
가이드
개발
플러그인
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
FlowModel
플로우 리소스

@nocobase/logger

로거

@nocobase/server

AppCommand
애플리케이션
AuditManager
컨텍스트
마이그레이션
플러그인

@nocobase/sdk

Auth
Storage
Previous PageHasOneRepository
Next Pageshared
TIP

이 문서는 AI로 번역되었습니다. 부정확한 내용이 있을 경우 영어 버전을 참조하세요

#리포지토리

#개요

주어진 컬렉션 객체에서 해당 컬렉션의 데이터를 읽고 쓰는 작업을 수행하기 위해 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,
  },
});

#연산자

Repository의 filter 매개변수는 더욱 다양한 조회 작업을 수행할 수 있도록 여러 연산자를 제공합니다.

// 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 매개변수는 연관 필드를 기준으로 필터링을 지원합니다. 예를 들어:

// 연관된 posts에 'post title'이라는 제목을 가진 객체가 있는 user 객체를 조회합니다.
userRepository.find({
  filter: {
    'posts.title': 'post title',
  },
});

연관 필드는 중첩하여 사용할 수도 있습니다.

// posts의 comments에 keywords가 포함된 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',
        },
      ],
    },
  ],
});
// 사용자를 생성하는 동시에, 게시물(post)을 생성하여 사용자와 연관시키고, 태그(tags)를 생성하여 게시물과 연관시킵니다.

만약 연관 객체가 이미 데이터베이스에 존재한다면, 해당 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, // 게시물(post)과 태그(tags)의 연관 관계 해제
  },
});

#삭제

Repository의 destroy() 메서드를 호출하여 삭제 작업을 수행할 수 있습니다. 삭제 시 필터링 조건을 지정해야 합니다:

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가 어떤 필드인지는 컬렉션에서 설정할 수 있으며, 기본값은 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

결과 수를 제한하며, SQL의 limit과 동일합니다.

#offset: number

조회 오프셋이며, SQL의 offset과 동일합니다.

예시

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

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

#findOne()

데이터베이스에서 특정 조건을 만족하는 단일 데이터를 조회합니다. Sequelize의 Model.findOne()과 동일합니다.

시그니처

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

예시

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

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

#count()

데이터베이스에서 특정 조건을 만족하는 데이터의 총 개수를 조회합니다. Sequelize의 Model.count()와 동일합니다.

시그니처

  • 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()

데이터베이스에서 특정 조건을 만족하는 데이터셋과 총 결과 수를 조회합니다. Sequelize의 Model.findAndCountAll()과 동일합니다.

시그니처

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

타입

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

세부 정보

조회 매개변수는 find()와 동일합니다. 반환 값은 배열이며, 첫 번째 요소는 조회 결과이고 두 번째 요소는 총 개수입니다.

#create()

컬렉션에 새로 생성된 데이터를 삽입합니다. Sequelize의 Model.create()와 동일합니다. 생성할 데이터 객체에 관계 필드 정보가 포함되어 있으면, 해당 관계 데이터 레코드도 함께 생성되거나 업데이트됩니다.

시그니처

  • 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()

컬렉션의 데이터를 업데이트합니다. Sequelize의 Model.update()와 동일합니다. 업데이트할 데이터 객체에 관계 필드 정보가 포함되어 있으면, 해당 관계 데이터 레코드도 함께 생성되거나 업데이트됩니다.

시그니처

  • 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()

컬렉션의 데이터를 삭제합니다. Sequelize의 Model.destroy()와 동일합니다.

시그니처

  • 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: 트랜잭션 객체입니다. 트랜잭션 매개변수가 전달되지 않으면, 이 메서드는 자동으로 내부 트랜잭션을 생성합니다.