Objection.js
概要
Model
code:javascript
const { 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テーブルに新しい行を作成する
code:javascript
await message.$relatedQuery('tags').relate(tag.id)
// 'insert into message_tags (tag_id, message_id) values (?, ?)'
サブクエリ
whereやwhereInの引数に関数を渡す。
その関数内でthisを参照し、副問い合わせのために利用されるSQLを構築する。
code: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オブジェクト等を設定すると便利。
code:javascript
let 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