GetData APIを使用した複雑のクエリのいくつかのサンプルをご説明します。
複数のソートキーを指定する
orderBy()は複数指定することができます。
先に指定したカラムから順に、第1ソートキー、第2ソートキー、……となります。
ModelA.select()
.orderBy('itemId', AppPot.Model.Order.desc)
.orderBy('id', AppPot.Model.Order.desc)
.findList()
引数によってwhere条件を変える
where()などは返り値がQueryですので、変数にQuery
を代入しておくことで、条件によってwhere
の有無やwhere
条件の変更などが可能になります。
fetchByGroupId(groupId) {
var query = ModelA.select();
if (groupId) {
query = query.where('groupId=?', groupId);
}
return query.findList();
}
ループ処理の中でクエリを実行する
Promise.all()
の中でループ処理を実行し、クエリの実行結果のPromise
をreturn
することで、ひとまとまりの非同期処理として扱うことができます。
fetchByItems(items) {
return Promise.all(
items.map((item) => {
return ModelA.select()
.where('itemId=?', item.id)
.findOne();
})
)
}
クエリの非同期処理を連続して実行する
Promise.then()
を使って、非同期処理を連続して実行していきます。
検索結果を保持する変数を用意しておき、その変数に検索結果を代入していきます。
連続処理の最後で検索結果を保持しておいた変数をreturn
します。
fetchModelChain() {
var result = {};
return ModelA.select()
.findList()
.then((response) => {
result.modelA = response;
return ModelB.select()
.findList();
})
.then((response) => {
result.modelB = response;
return result;
})
}
複数のモデルをJOINする
複数のモデルをjoin()することができます。
where()やorderBy()の条件にjoin
したモデルを指定することもできます。
ModelA.select()
.join(ModelB, '#ModelA.b_id = #ModelB.id')
.join(ModelC, '#ModelA.c_id = #ModelC.id')
.where('#ModelB.groupId=? and #ModelC.itemId=?', 'abcd', 'xyz')
.orderBy('#ModelA.created_at', AppPot.Model.Order.desc)
.findList()
モデルのインスタンスメソッドでクエリを使う
defineModelの第2引数のオブジェクトに関数を指定して渡すと、インスタンスメソッドを追加することができます。
Modelのインスタンスメソッドを定義して、その中でクエリを作成する場合、モデルのコンストラクタからselect()を呼び出すことができます。
AppPot.defineModel('ModelA', {
'id': {
type: AppPot.DataType.Varchar,
length: 255
},
'fetchList': function() {
return this.constructor.select()
.findList();
}
});