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()の中でループ処理を実行し、クエリの実行結果のPromisereturnすることで、ひとまとまりの非同期処理として扱うことができます。

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();
  }
});