我有以下实体:
PBOUser
,PBOBusiness
和PBOLocation
。
PBOUser
可能有很多业务。PBOBusiness
可能包含很多位置。PBOLocation
可能只属于一家公司。PBOBusiness
可能属于许多用户。我需要找到属于我的用户所拥有的那些商家的这些位置。
let predicate = NSPredicate(format: "business IN %@", myUser.businesses)
let locations = PBOLocation.MR_findAllWithPredicate(predicate) as? [PBOLocation]
但它不起作用。如何快速完成这项工作?
答案 0 :(得分:1)
如果您想将其作为查询执行,则需要使用SUBQUERY
谓词
let predicate = NSPredicate(format: "SUBQUERY(business.users, $user, $user == %@).@count > 0", myUser)
business.users
是要测试其元素的集合的keyPath $user == %@
$user
来使谓词中使用的单个元素的变量名称 SUBQUERY
将返回匹配的结果集合,以便总结我们使用@count > 0
来说明是否至少有一个匹配,那么这符合我们的标准
答案 1 :(得分:0)
你可能想出一个有效的谓词。但是既然你已经引用了PBOUser
,那么你就会比他们需要的更难。考虑一下
PBOUser
与PBOBusiness
PBOBusiness has a relationship to
PBOLocation` 通过这些关系,用户的商家信息为myUser.businesses
,与您的代码段一样。因此,更进一步,并使用位置是企业财产的事实:
let locations = myUser.businesses.valueForKey("location") as NSSet
这利用了这样一个事实:数组或集合上的valueForKey
将在集合的每个成员上调用valueForKey
,并将结果作为相同类型的集合返回。这就是为什么它是NSSet
- 如果你想要一个排序的数组,请添加对sortedArrayUsingDescriptors:
的调用。