2

使用 Vapor 和 Fluent(如果重要的话是 PostgreSQL)我有一个实体BaID: NodeA 是 B 的父级)要引用A,并且AB. 如何进行查询以获取所有A按 ' 的计数排序的B'?

我希望结果看起来像这样:

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

首先,

  1. 为 A 创建一个模态
  2. 将该 JSON 字符串转换为 A 的数组

如果你这样做,你的排序变得像 -

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

于 2016-12-07T11:33:00.943 回答
0

完全在 Fluent 中使用Entity. 首先,您需要使用原始 SQL 来获取您的bCount. 其次,您需要将您的内容更改init(node:)为 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 回答