2016-09-10 152 views
1

大家好我有困難歸檔一個事物與嵌套對象的查詢。我有兩個領域對象冠軍和遊戲。領域查詢嵌套對象

class Championship: Object { 
    dynamic var id: Int = 0 
    dynamic var name: String = "" 
    let games = List<Game> 

    override static func primaryKey() -> String? { 
     return "id" 
    } 

} 

class Game: Object { 
    dynamic var id: Int = 0 
    dynamic var homeTeamName: String = "" 
    dynamic var awayTeamName: String = "" 
    dynamic var status: String = "" //"inprogress", "finished", "scheduled" 

    override static func primaryKey() -> String? { 
     return "id" 
    } 

} 

,基本上我希望檢索與地位「INPROGRESS」遊戲所有的冠軍,所以我在做什麼存檔是:

let realm = try! Realm() 
realm.objects(Championship.self).filter("ANY games.status = 'inprogress'") 

什麼該查詢正在做的是給我所有的錦標賽都至少有一場比賽的狀態,但同時也給了我所有比賽的冠軍,但實際上我只是想讓這些比賽處於「進行中」狀態。

有沒有辦法做到這一點?

回答

0

您可以在這裏採取兩種方法。如果你想與inprogress狀態的所有遊戲中,你可以這樣寫:

let inProgressGames = realm.objects(Championship.self) 
          .flatMap { $0.games } 
          .filter { $0.status == "inprogress" } 

這將返回所有遊戲正在進行內部[Game]陣列。 flatMap用於組合所有錦標賽中的所有遊戲,filter用於過濾所有具有inProgress狀態的遊戲。

如果你想錦標賽上每一場比賽都是inprogress你可以寫:

let inProgressChampionships = realm.objects(Championship.self).filter { 
    let inProgressGames = $0.games.filter { $0.status == "inprogress"} 
    return $0.games.count == inProgressGames.count 
} 

其中每個遊戲inprogress這將返回的Championship陣列。

除此之外,我會建議使用enum來取代遊戲狀態而不是硬編碼的字符串。

+0

我很關注領域查詢。第二個建議爲我做了這份工作 – GoNinja

+0

我不得不調整一下你的建議,因爲過濾遊戲的結果與我的領域查詢相同......所以現在我所做的是每個冠軍部分我過濾現場遊戲。我不知道這是否是最有效的方式...但現在會做。 Thx再次提出建議 – GoNinja