Objection.js
概要
Model
javascriptconst { Model } = require('objection');
class User extends Model {
static get tableName() {
return 'users';
}
}
static tableName
マッピング対象のテーブル名を指定する。
static idColumn
プライマリキーを指定する。
省略時は "id"
がデフォルト値として使用される。
static fromJson(json, opts)]
プレーンオブジェクトからModelのインスタンスを生成する。
その際、 jsonSchema
に基づいてバリデーションが行われ、失敗した際はエラーが発生する。
toJSON()
Modelのインスタンスをプレーンオブジェクトへ変換する。
Validation
jsonSchema
をModelの静的プロパティとして定義しておくと、Modelのインスタンス作成時にバリデーションが行われる。
QueryBuilderの insert
や patch
メソッド等を実行すると、暗黙的にModelのインスタンスが作成されるため、
その際にもバリデーションが行われる。
マイグレーション
キャメルケース・スネークケースの変換
Eager loading
メソッド
QueryBuilder#eager(relationExpression, [modifiers])
QueryBuilder#eagerAlgorithm(algo)
Eager loadingを実行する際のクエリの発行方法(Eager Algorithm)を変更できる。
QueryBuilder#joinEager(relationExpression)
queryBuilder.eager(expr).eagerAlgorithm(JoinEagerAlgorithm)
を簡略化したメソッド。
QueryBuilder#eagerOptions(options)
options.joinOperation
- 'leftJoin'
, 'innerJoin'
等、JOINする際に利用される演算方法を指定する。
RelationExpression
#eager
メソッド等で使用する式。
Eager Algorithm
WhereInEagerAlgorithm
デフォルトで使用される。
JoinEagerAlgorithm
NaiveEagerAlgorithm
Tips
JOINテーブルに新しい行を作成する
javascriptawait message.$relatedQuery('tags').relate(tag.id)
// 'insert into `message_tags` (`tag_id`, `message_id`) values (?, ?)'
サブクエリ
where
や whereIn
の引数に関数を渡す。
その関数内で this
を参照し、副問い合わせのために利用されるSQLを構築する。
javascript class Message extends Model {
static async taggedWith(tag, page, perPage) {
function tagId() {
this.select('id').from('tags').where('name', '=', tag);
}
function messageIds() {
this.select('message_id').from('message_tags').where('tag_id', '=', tagId);
}
return this
.query()
.page(page, perPage)
.eager('tags')
.whereIn('id', messageIds);
}
}
Message.taggedWith('hoge');
テスト
Model.knex(knex)
メソッド
Objection.jsが内部で使用するKnexオブジェクトを設定できる。
これを使って、Transactionオブジェクト等を設定すると便利。
javascriptlet trx, knex;
beforeEach(async () => {
knex = Model.knex();
trx = await transaction.start();
Mode.knex(trx);
});
afterEach(async () => {
await trx.rollback();
Model.knex(knex);
});
ロギング
Knex.jsの
debug
オプションを有効化すると、実行したクエリがログに出力される
GraphQL