【问题标题】:How can I sort based on children?如何根据孩子进行排序?
【发布时间】:2017-04-19 05:03:17
【问题描述】:

使用 Vapor 和 Fluent(如果重要,请使用 PostgreSQL)我有实体 B 具有 aID: Node(A 是 B 的父级)来引用 AA 与 @987654325 具有一对多关系@。如何查询以获取按B 的计数排序的所有A

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

All A's in DB

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

【问题讨论】:

    标签: database postgresql sorting fluent vapor


    【解决方案1】:

    首先,

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

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

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

    【讨论】:

    • 谢谢,这样可以。我宁愿不获取数据库中的所有对象然后排序。如果我可以用 Fluent 来做,我宁愿让 SQL 为我做排序。
    • 考虑时间会更有效率。 :)
    【解决方案2】:

    使用Entity 完全在 Fluent 中实现这将是一件棘手的事情。首先,您需要使用原始 SQL 来获取您的bCount。其次,您需要将您的init(node:) 更改为接受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)
          }
        }
      }
    }
    

    正如我之前所说,A 上的 init 方法将接收 bCount,因此您需要将其存储在那里。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-21
      • 2010-10-31
      • 2020-03-07
      相关资源
      最近更新 更多