【问题标题】:Subquery between three objects [duplicate]三个对象之间的子查询[重复]
【发布时间】:2016-08-10 17:38:44
【问题描述】:

我有三个不同的模型部门、子部门和员工

@interface Department : RLMObject

@property NSString *name;
@property (nonatomic, strong) RLMArray<SubDepartment> *subDepartments; 
@property (nonatomic, strong) RLMArray<Employee> *employees; 

@end

@interface SubDepartment : RLMObject

@property NSString *name; 
@property (nonatomic, strong) RLMArray<Employee> *employees; 

@end 

@interface Employee : RLMObject

@property NSString *department;
@property NSString *email;
@property NSString *firstname;
@property NSString *lastname;
@property NSString *fullname;
@property NSString *imgUrl;
@property NSString *imgWall;
@property NSString *nickname;

@end

我想搜索哪个部门的员工的名字和姓氏中包含“a”,还想搜索名字和姓氏中包含“a”的子部门员工。

我试图这样做。

RLMResults *subdepartments = [SubDepartment objectsWhere:
                            [NSString stringWithFormat:@"SUBQUERY(employees, $e, $e.firstname contains '%@' OR $e.lastname contains '%@' OR $e.fullname contains '%@' OR $e.nickname contains '%@').@count > 0",searchText,searchText,searchText,searchText]];

    NSMutableArray *subDepartmentNames = [NSMutableArray array];

    for (SubDepartment *subDepartment in sections)
    {
        [subDepartmentNames addObject:subDepartment.name];
    }

    RLMResults *departments = [Department objectsWhere:
                     [NSString stringWithFormat:@"SUBQUERY(employees, $e, $e.firstname contains '%@' OR $e.lastname contains '%@' OR $e.fullname contains '%@' OR $e.nickname contains '%@').@count > 0",searchText,searchText,searchText,searchText]];

    RLMResults<Department *> *filteredDepartments = [departments objectsWhere:
                                            [NSString stringWithFormat:@"SUBQUERY(subDepartments, $d, $d.name IN '%@').@count > 0",sectionNames]];

【问题讨论】:

  • 请展示您自己尝试解决问题的示例。
  • 我更新了我的示例。 @VadimShkaberda

标签: objective-c realm


【解决方案1】:

也许您不需要使用子查询。更简单地说,您可以在查询中使用ANY,如下所示:

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

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

@interface Employee : RLMObject

...

@property (readonly) RLMLinkingObjects *departments;
@property (readonly) RLMLinkingObjects *subDepartments;

@end

@implementation User

+ (NSDictionary *)linkingObjectsProperties {
    return @{@"departments": [RLMPropertyDescriptor descriptorWithClass:Department.class propertyName:@"employees"],
             @"subDepartments": [RLMPropertyDescriptor descriptorWithClass:SubDepartment.class propertyName:@"employees"]};
}

@end

然后你可以从User的属性中获取用户所属的部门和部门,如下:

RLMResults *employees = [Employee objectsWhere:@"firstname CONTAINS %@ OR lastname CONTAINS %@" , searchText, searchText];
for (Employee *employee in employees) {
    NSLog(@"%@", employee.departments);
    NSLog(@"%@", employee.subDepartments);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-26
    • 1970-01-01
    • 1970-01-01
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多