我如何根据孩子进行排序?

问题描述:

使用蒸汽和流利(PostgreSQL的,如果该事项)我有了aID: Node实体B(A是B的母公司)来引用AAB一个一对多的关系。我如何查询所有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 
    } 
] 

首先,

  1. 对于A
  2. 把那JSON字符串到数组创建模式

如果你这样做你的排序变得容易,因为 -

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

+1

谢谢,这将工作。我宁愿不去获取数据库中的所有对象,然后进行排序。如果我能用Fluent做到这一点,我宁愿让SQL为我排序。 – KKendall

+0

考虑到时间会更有效率。 :) –

这将是棘手的使用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所以你需要将它存储在那里。