我如何根据孩子进行排序?
问题描述:
使用蒸汽和流利(PostgreSQL的,如果该事项)我有了aID: Node
实体B
(A是B的母公司)来引用A
和A
有B
一个一对多的关系。我如何查询所有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
}
]
答
首先,
- 对于A
- 把那JSON字符串到数组创建模式
如果你这样做你的排序变得容易,因为 -
array.sort { $0.bCount < $1.bCount }
答
这将是棘手的使用Entity
以流利的完全实现。首先,您需要使用原始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
然后,运行该查询,让您的一个模型。
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
所以你需要将它存储在那里。
谢谢,这将工作。我宁愿不去获取数据库中的所有对象,然后进行排序。如果我能用Fluent做到这一点,我宁愿让SQL为我排序。 – KKendall
考虑到时间会更有效率。 :) –