2016-12-04 44 views
2

使用蒸汽和流利(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 
    } 
] 

回答

0

首先,

  1. 對於A
  2. 把那JSON字符串到數組創建模式

如果你這樣做你的排序變得容易,因爲 -

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

+1

謝謝,這將工作。我寧願不去獲取數據庫中的所有對象,然後進行排序。如果我能用Fluent做到這一點,我寧願讓SQL爲我排序。 – KKendall

+0

考慮到時間會更有效率。 :) –

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所以你需要將它存儲在那裏。

相關問題