在领域中的子查询和IN语句

我有三个领域对象。 部门,部门和用户。 部门是一个部门的一个子部门。 但是每个部门和每个部门都会有用户。

@interface Department : RLMObject @property NSString *name; @property BOOL isCollapsed; @property (nonatomic, strong) RLMArray<Section> *sections; @property (nonatomic, strong) RLMArray<User> *users; @end @interface Section : RLMObject @property NSString *name; @property BOOL isCollapsed; @property RLMArray<User> *users; @end @interface User : RLMObject @property NSString *department; @property NSString *email; @property NSString *firstname; @property NSString *lastname; @property NSString *fullname; @end 

我想要做的是,我要search所有名字和姓氏都包含“a”并与部门和部门相链接的用户。

现在我正在做的是

 searchText = [searchText lowercaseString]; RLMResults *sections = [Section objectsWhere: [NSString stringWithFormat:@"SUBQUERY(users, $user, $user.fullname contains '%@' OR $user.nickname contains '%@').@count > 0",searchText,searchText]]; NSMutableArray *sectionNames = [NSMutableArray array]; for (Section *section in sections) { [sectionNames addObject:section.name]; } NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(sections, $section, $section.name IN %@).@count > 0", sectionNames]; RLMResults *filteredDepartments = [[Department objectsWithPredicate:predicate] sortedResultsUsingProperty:@"name" ascending:YES]; NSPredicate *pred = [NSPredicate predicateWithFormat:@"SUBQUERY(users, $user, $user.fullname contains %@ OR $user.nickname contains %@).@count > 0",searchText,searchText]; RLMResults *departments = [filteredDepartments objectsWithPredicate:pred]; 

现在的问题是在部分数组中有两个部分,但在部署结果中,它返回null。 请帮忙。 谢谢。

注意:如果一个用户已经属于该部分,那么该用户将不被包含在部门中。

也许你不需要使用子查询。 更简单地说,你可以像下面这样在查询中使用ANY

 [Department objectsWhere: @"ANY users.firstname CONTAINS %@ OR ANY users.lastname CONTAINS %@ OR ANY sections.users.firstname CONTAINS %@ OR ANY sections.users.lastname CONTAINS %@", searchText, searchText, searchText, searchText]; 

但是我认为使用反向关系更容易。 在Realm中,反转关系是用RLMLinkingObjects定义的。 您可以添加反向关系到User类,如下所示:

 @interface User : RLMObject ... @property (readonly) RLMLinkingObjects *departments; @property (readonly) RLMLinkingObjects *sections; @end @implementation User + (NSDictionary *)linkingObjectsProperties { return @{@"departments": [RLMPropertyDescriptor descriptorWithClass:Department.class propertyName:@"users"], @"sections": [RLMPropertyDescriptor descriptorWithClass:Section.class propertyName:@"users"]}; } @end 

然后,您可以从User的财产中获取用户所属的部门和部门,如下所示:

 RLMResults *users = [User objectsWhere:@"firstname CONTAINS %@ OR lastname CONTAINS %@" , searchText, searchText]; for (User *user in users) { NSLog(@"%@", user.departments); NSLog(@"%@", user.sections); }