假设我有一个类似下面的模型,我需要获取按personRole.roleWeight排序的特定Company.companyName的所有'Person'
这是我目前的模特:
关系:companyRole
实体:角色
关系:rolePerson,RoleCompany
实体:人
以下是关系的简单图表:
公司 - <角色> - <人
有办法做到这一点吗? 如果我需要修改模型,我很乐意这样做。欢迎提出所有建议。
谢谢,
答案 0 :(得分:1)
您无法按角色权重排序,因为可能有多个适合的角色。
你也不能从角色(而不是角色)来到它,因为角色和人之间有多对多的角色。
你应该重新思考你的设计,因为拥有那么多对多没有多大意义。一点点数据去规范化,将多对多更改为一对多并重复角色名和角色权值将解决问题。
假设您将设计更改为:
Company --< Role >-- Person
然后解决方案变得更加容易:
- (NSArray*)peopleSortedByWeightInCompany:(NSString*)company inManagedObjectContext:(NSManagedObjectContext*)moc
{
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Role" inManagedObjectContext:moc]];
[request setPredicate:[NSPredicate predicateWithFormat:@"company.name == %@", companyName]];
NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"weight" ascending:YES];
[request setSortDescriptors:[NSArray arrayWithObject:sort]];
NSError *error = nil;
NSArray *roles = [moc executeFetchRequest:request error:&error];
[request release], request = nil;
NSAssert2(roles != nil && error == nil, @"Error fetching roles: %@\n%@", [error localizedDescription], [error userInfo]);
NSArray *people = [roles valueForKeyPath:@"@distinctUnionOfObjects.person"];
return people;
}
您基本上获取按权重排序并按公司名称过滤的角色实体。然后,从该角色实体数组中,您可以使用KVC收集关系另一端的所有人物对象,这些对象将按顺序检索它们。
答案 1 :(得分:0)
是否有理由认为角色是中间的猴子而不是人?这将使这项任务变得更容易,但也许您正在使用其他方法来排除此选项。如果每个人都有一个角色和一个公司,那么您可以为role.roleWeight创建排序描述符,并在公司的员工关系集中使用NSSet的sortedArrayUsingDescriptors:
方法。这将为您提供一个新的排序数组,其中列出了按角色排序的所有附加到给定公司的Person实体(您可能希望包含一个辅助排序描述符来处理匹配的roleWeights)。