0

我需要一些有关领域快速查询的帮助。这是业务上下文:

有两种用户类型:

用户类型 1:展会经理

节目经理可以创建节目。您将在下面找到 Show 对象的必要详细信息。如您所见,每个节目都有一个属性 artistResponses,它是 ArtistResponse 的列表。

class Show: Object {
    @objc dynamic var id = UUID().uuidString
    @objc dynamic var createdDate = Date()
    @objc dynamic var showManager: ShowManager!
    @objc dynamic var venueName = ""
    @objc dynamic var city = ""
    ...
    **let artistResponses = List<ArtistResponse>()**

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

    ... 
}

用户类型 2:艺术家

Artist 对象具有 cityOfInterest 属性,并且应用程序上的艺术家只应显示由演出经理创建的演出,其中演出城市位于艺术家的 cityOfInterest 中。然后,艺术家可以查看这些节目并做出回应,这将创建一个 ArtistResponse 对象并将其添加到上面在 Show 对象中看到的列表中。您将在下面找到 Artist 以及 ArtistResponse 对象的必要详细信息。

class Artist: Object {
    @objc dynamic var id = UUID().uuidString
    @objc dynamic var createdDate = Date()
    **let citiesOfInterest = List<String>()**
}
class ArtistResponse: Object {
    @objc dynamic var id = UUID().uuidString
    @objc dynamic var createdDate = Date()
    @objc dynamic var show: Show!
    @objc dynamic var artist: Artist!
    **@objc dynamic var available = true**

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

我遇到问题的查询与确定它是否是新节目有关(即艺术家没有与节目关联的 ArtistResponse 将他们自己列为可用或不可用)。

这是一个例子:

一位名叫 Bob 的节目经理创建了一个节目,其中 city = “Austin” 一位名叫 Jim 的艺术家的itiesOfInterest = [“Austin”, “Seattle”, “San Francisco”]

艺术家 Jim 进入应用程序,应该会看到演出经理 Bob 发布的这个新演出列表,因为 Jim 的 cityOfInterest 包含“Austin”,演出的城市等于“Austin”,并且没有与 Jim 相关的艺术家回复。

我研究并发现 Realm 中的列表存在限制。

https://forum.realm.io/t/predicate-to-search-in-field-of-type-list/733 https://github.com/realm/realm-cocoa/issues/5334

请帮助这个查询:

Realm.objects(Show.self).filter(“以某种方式确定artistResponses列表中没有与Jim相关的artistResponse”)

有人可以帮我吗?我希望我已经提供了足够的解释。

4

1 回答 1

1

让我重申这个问题;

您希望艺术家能够查询他们感兴趣的城市中尚未回复的所有新节目。

如果这是问题,让我从一些简单的示例数据开始

两位艺术家,如果有兴趣,他们各自有两个城市

let a0 = Artist()
a0.name = "Jim"
a0.citiesOfInterest.append(objectsIn: ["Austin", "Memphis"])

let a1 = Artist()
a1.name = "Henry"
a1.citiesOfInterest.append(objectsIn: ["Austin", "Memphis"])

然后两场演出,每个城市一场

let s0 = Show()
s0.name = "Austin Show"
s0.city = "Austin"

let s1 = Show()
s1.name = "Memphis Show"
s1.city = "Memphis"

但是艺术家a0(吉姆)已经回应了s0(奥斯汀)的节目

let r0 = ArtistResponse()
r0.show = s0
r0.artist = a0
r0.available = true

s0.artistResponses.append(r0) //jim responded to the Austin show

我们想要的结果是,当艺术家 Jim 登录时,他将看到孟菲斯秀,因为他已经响应了奥斯汀秀。

let realm = try! Realm()
if let jim = realm.objects(Artist.self).filter("name == 'Jim'").first {
   let myCities = jim.citiesOfInterest
   let showResults = realm.objects(Show.self)
                          .filter("city IN %@ AND !(ANY artistResponses.artist.name == 'Jim')", myCities)
   for show in showResults {
      print(show.name)
   }              
}

输出是

Memphis Show

我们首先将 Jim 感兴趣的城市作为一个数组,然后过滤与这些感兴趣的城市相匹配但没有与 Jim 相关联的艺术家响应的节目。此过滤器基于名称,但您可以使用 Artist id 甚至是 Artist 对象本身作为比较器。

于 2019-11-28T14:56:57.660 回答