Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 与核心数据有很多关系_Sql_Objective C_Ruby On Rails_Core Data_Magicalrecord - Fatal编程技术网

Sql 与核心数据有很多关系

Sql 与核心数据有很多关系,sql,objective-c,ruby-on-rails,core-data,magicalrecord,Sql,Objective C,Ruby On Rails,Core Data,Magicalrecord,假设我有3个模型:酒店、分类和客房。 一个酒店有很多种类,一个种类有很多房间 我想得到一个特定酒店所有房间号码的数组 在Rails中,如果使用ActiveRecord,我将具有以下功能: class Hotel has_many :categories has_many :rooms, through: :categories end class Category has_many :rooms end 然后,如果我有一个hotel对象,查询将非常简单: hotel.rooms.m

假设我有3个模型:酒店、分类和客房。 一个酒店有很多种类,一个种类有很多房间

我想得到一个特定酒店所有房间号码的数组

在Rails中,如果使用ActiveRecord,我将具有以下功能:

class Hotel
  has_many :categories
  has_many :rooms, through: :categories
end
class Category
  has_many :rooms
end
然后,如果我有一个hotel对象,查询将非常简单:

hotel.rooms.map(&:room_number)
我会得到一组旅馆的房间号码

如何使用Objective-C和核心数据实现同样的目标?MagicalRecord可以帮助进行这种抽象吗?我是否必须直接编写SQL语句,因为当前的ORM不支持类似的内容

谢谢,
Nicolas

您不需要使用核心数据编写任何SQL查询,尤其是使用神奇记录。 下面是一个关于如何获取对象和关系的文档

一个简单的例子是:

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

NSArray *rooms = [Person MR_findAllWithPredicate:roomFilter];

这只是一个示例代码,不要将其视为一个完全有效且经过测试的解决方案。

假设关系定义如下:

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

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"];
有了魔法记录,这可能看起来像(未经测试):


你开始写Objective-C代码了吗?我没有。我可以直接编写SQL查询,或者先获取酒店的类别,然后再进行第二次查询,为获取的类别获取房间。我只是想知道,是否有一种明显的方法可以在更高的级别(如ActiveRecord)上实现这一点,但我可能没有。我知道这一点,但我想问的是一个具体的案例,当我有3个具有许多关系的模型时。在这种情况下,有没有一种简单的方法来编写谓词来处理链接?非常感谢!我缺少的一点是,我们可以在诸如@“category.hotel==%@”这样的谓词中进行链接。我不知道实体上的KVO选项,尽管我不确定自己是否完全理解它,但非常感谢您为我指明了正确的方向!
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"category.hotel == %@", theHotel];
NSArray *rooms = [Room MR_findAllWithPredicate:predicate];
NSArray *roomNumbers = [rooms valueForKey:@"roomNumber"];