0

假设我有 3 个模型:Hotel、Category 和 Room。一个酒店有很多类别,一个类别有很多房间。

我想获取特定酒店的所有房间号的数组。

在 Rails 中,使用 ActiveRecord 我将拥有以下内容:

class Hotel
  has_many :categories
  has_many :rooms, through: :categories
end
class Category
  has_many :rooms
end

然后,如果我有一个酒店对象,查询将很简单:

hotel.rooms.map(&:room_number)

我会得到一系列酒店的房间号。

如何使用 Objective-C 和 Core Data 实现相同的目标?MagicalRecord 可以帮助这种类型的抽象吗?我是否必须直接编写 SQL 语句,因为当前的 ORM 不支持这样的东西?

谢谢,尼古拉斯

4

2 回答 2

2

假设关系是这样定义的:

在此处输入图像描述

您可以使用“键值编码”来获取给定酒店的所有房间号:

Hotel *theHotel = ...;
NSSet *setOfRoomNumbers = [theHotel valueForKeyPath:@"categories.@distinctUnionOfSets.rooms.roomNumber"];
// And if you need an array instead of a set:
NSArray *arrayOfRoomNumbers = [setOfRoomNumbers allObjects];

这种方法的一个缺点是它首先获取所有类别,然后是房间。

或者,您可以使用反向关系对“房间”实体执行获取请求:

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Room"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"category.hotel == %@", theHotel];
request.predicate = predicate;
NSArray *rooms = [context executeFetchRequest:request error:&error];
NSArray *roomNumbers = [rooms valueForKey:@"roomNumber"];

使用 Magical Record,这可能看起来像(未经测试):

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"category.hotel == %@", theHotel];
NSArray *rooms = [Room MR_findAllWithPredicate:predicate];
NSArray *roomNumbers = [rooms valueForKey:@"roomNumber"];
于 2013-10-18T03:38:20.430 回答
0

您不需要使用 Core Data 编写任何 SQL 查询,尤其是使用 Magical Record。这是有关如何获取对象和关系的文档的链接。

一个简单的例子是这样的:

NSArray *rooms = @[@1, @2, @3, @4];
NSPredicate *roomFilter = [NSPredicate predicateWithFormat:@"Rooms IN %@", rooms];

NSArray *rooms = [Person MR_findAllWithPredicate:roomFilter];

这只是一个示例代码,不要将其视为完全工作和测试的解决方案。

于 2013-10-17T22:02:06.147 回答