2

Vapor と Fluent (重要な場合は PostgreSQL) を使用して、 (A は B の親) を参照し、1 対多の関係を持つエンティティBがあります。の数でソートされたすべての を取得するクエリを作成するにはどうすればよいですか?aID: NodeAABAB

結果を次のようにしたい:

All A's in DB

[
  {
    "id": 4,
    "name": "Hi",
    "bCount": 1000
  },
  {
    "id": 3,
    "name": "Another",
    "bCount": 800
  },
  {
    "id": 5,
    "name": "Test",
    "bCount": 30
  }
]
4

2 に答える 2

0

を使用して Fluent で完全に実装するのは難しいでしょうEntity。まず、生の SQL を使用してbCount. init(node:)第 2 に、 acceptに変更する必要がありますが、保存されたデータベース フィールドを作成したくないため、これはbCountあなたのものであってはなりません。makeNode()

生のSQL(テストされていない)でこれを試してください:

SELECT
  A.*,
  (
    SELECT COUNT(*)
    FROM B
    WHERE B.aID = A.id
  ) AS bCount
FROM A
ORDER BY bCount

次に、そのクエリを実行して A モデルを取得します。

var models: [A] = []
if let driver = drop.database?.driver as? PostgreSQLDriver {
  if case .array(let array) = try driver.raw(sql) {
    for result in array {
      do {
        var model = try A(node: result)
        models.append(model)
      }
    }
  }
}

前に言ったように、あなたの init メソッドAは受信bCountするので、そこに保存する必要があります。

于 2016-12-26T21:05:48.500 に答える
0

まず、

  1. A のモーダルを作成する
  2. その JSON 文字列を A の配列に変換します

これを行うと、並べ替えは次のように簡単になります-

array.sort { $0.bCount < $1.bCount }

于 2016-12-07T11:33:00.943 に答える