2016-09-10 104 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