谓词获取参数包含在特定 NSSet 中的对象
Predicate to fetch objects which parameter is contained in an specific NSSet
我有以下实体:
PBOUser
、PBOBusiness
和 PBOLocation
。
PBOUser
可能有很多生意。
PBOBusiness
可能有很多位置。
PBOLocation
可能只属于一个企业。
PBOBusiness
可能属于多个用户。
我需要找到属于我的用户拥有的那些企业的这些位置。
let predicate = NSPredicate(format: "business IN %@", myUser.businesses)
let locations = PBOLocation.MR_findAllWithPredicate(predicate) as? [PBOLocation]
但是没用。如何快速做到这一点?
您可能想出一个有效的谓词。但是由于您已经有对 PBOUser
的引用,所以您正在使事情变得比他们需要的更难。考虑
PBOUser
与 PBOBusiness
有关系
PBOBusiness has a relationship to
PBOLocation`
有了这些关系,用户的业务就是 myUser.businesses
,如您的代码段所示。因此,更进一步,利用地点是 属性 企业这一事实:
let locations = myUser.businesses.valueForKey("location") as NSSet
这利用了这样一个事实,即数组或集合上的 valueForKey
将对集合的每个成员调用 valueForKey
,并且 return 结果与同类集合相同.这就是为什么它是 NSSet
-- 如果你想要一个排序数组,添加对 sortedArrayUsingDescriptors:
.
的调用
如果您想将其作为查询来执行,则需要使用 SUBQUERY
谓词
let predicate = NSPredicate(format: "SUBQUERY(business.users, $user, $user == %@).@count > 0", myUser)
business.users
是要测试其元素的集合的键路径
- 集合中的每一项都根据谓词
$user == %@
再次求值
- 当根据谓词评估每个项目时,我们使用
$user
使其成为要在谓词中使用的单个元素的变量名称
SUBQUERY
将 return 一组匹配的结果,因此总结一下,我们使用 @count > 0
来说明是否至少有一个匹配,那么这符合我们的标准
我有以下实体:
PBOUser
、PBOBusiness
和 PBOLocation
。
PBOUser
可能有很多生意。PBOBusiness
可能有很多位置。PBOLocation
可能只属于一个企业。PBOBusiness
可能属于多个用户。
我需要找到属于我的用户拥有的那些企业的这些位置。
let predicate = NSPredicate(format: "business IN %@", myUser.businesses)
let locations = PBOLocation.MR_findAllWithPredicate(predicate) as? [PBOLocation]
但是没用。如何快速做到这一点?
您可能想出一个有效的谓词。但是由于您已经有对 PBOUser
的引用,所以您正在使事情变得比他们需要的更难。考虑
PBOUser
与PBOBusiness
有关系
PBOBusiness has a relationship to
PBOLocation`
有了这些关系,用户的业务就是 myUser.businesses
,如您的代码段所示。因此,更进一步,利用地点是 属性 企业这一事实:
let locations = myUser.businesses.valueForKey("location") as NSSet
这利用了这样一个事实,即数组或集合上的 valueForKey
将对集合的每个成员调用 valueForKey
,并且 return 结果与同类集合相同.这就是为什么它是 NSSet
-- 如果你想要一个排序数组,添加对 sortedArrayUsingDescriptors:
.
如果您想将其作为查询来执行,则需要使用 SUBQUERY
谓词
let predicate = NSPredicate(format: "SUBQUERY(business.users, $user, $user == %@).@count > 0", myUser)
business.users
是要测试其元素的集合的键路径- 集合中的每一项都根据谓词
$user == %@
再次求值
- 当根据谓词评估每个项目时,我们使用
$user
使其成为要在谓词中使用的单个元素的变量名称
SUBQUERY
将 return 一组匹配的结果,因此总结一下,我们使用 @count > 0
来说明是否至少有一个匹配,那么这符合我们的标准