logologo
スタート
マニュアル
開発
プラグイン
API
English
简体中文
日本語
한국어
Deutsch
Français
Español
Português
Русский
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
フローモデル
フローリソース

@nocobase/logger

ロガー

@nocobase/server

AppCommand
アプリケーション
AuditManager
コンテキスト
マイグレーション
プラグイン

@nocobase/sdk

Auth
ストレージ
Previous PageHasOneRepository
Next Pageshared
TIP

このドキュメントはAIによって翻訳されました。不正確な情報については、英語版をご参照ください

#リポジトリ

#概要

特定のコレクションオブジェクトから、そのリポジトリオブジェクトを取得して、データテーブルの読み書き操作を実行できます。

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

const UserRepository = UserCollection.repository;

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

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

#クエリ

#基本的なクエリ

リポジトリオブジェクトでは、find*系のメソッドを呼び出すことでクエリ操作を実行できます。これらのクエリメソッドはすべてfilterパラメーターの指定に対応しており、データのフィルタリングに利用できます。

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

#オペレーター

リポジトリの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',
});

#作成

#基本的な作成

リポジトリを通じて新しいデータオブジェクトを作成します。

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をpostに関連付けます。

関連オブジェクトがすでにデータベースに存在する場合、その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を参照してください。

リポジトリを通じてデータを更新することもできます。

// フィルタリング条件を満たすデータレコードを更新します。
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', // 新しいtagを作成し、関連付けを確立します。
      },
    ],
  },
});

await postRepository.update({
  filter: {
    id: 1,
  },
  values: {
    tags: null, // postとtagsの関連付けを解除します。
  },
});

#削除

リポジトリの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',
  // ここで登録済みのリポジトリにリンクします
  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()と同じです。戻り値は配列で、最初の要素はクエリ結果、2番目の要素は結果の総数です。

#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: トランザクションオブジェクト。トランザクションパラメーターが渡されない場合、このメソッドは自動的に内部トランザクションを作成します。