2016-08-10 4 views
-1

У меня есть три различных модели Департамента, подотделы и сотрудникSubquery между тремя объектами

@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 

Я хочу найти какой отдел работника имеет содержит «а» в своем имени и фамилии, а также хотите искать сотрудники подразделения, чье имя содержит «а» от их имени и фамилии.

Я пытался это сделать.

RLMResults *subdepartments = [SubDepartment objectsWhere: 
          [NSString stringWithFormat:@"SUBQUERY(employees, $e, $e.firstname contains '%@' OR $e.lastname contains '%@' OR $e.fullname contains '%@' OR $e.nickname contains '%@')[email protected] > 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 '%@')[email protected] > 0",searchText,searchText,searchText,searchText]]; 

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

Пожалуйста показать пример вашей собственной попытки решения проблемы. –

+0

Я обновил свой пример. @VadimShkaberda – Aye

ответ

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 «s собственности, как следующее:

RLMResults *employees = [Employee objectsWhere:@"firstname CONTAINS %@ OR lastname CONTAINS %@" , searchText, searchText]; 
for (Employee *employee in employees) { 
    NSLog(@"%@", employee.departments); 
    NSLog(@"%@", employee.subDepartments); 
} 
Смежные вопросы