Получение данных из двух классов в одном PFQuery

Представьте себе гипотетический случай, когда у меня есть класс Car, содержащий такие атрибуты, как цвет, марка и т. д. У автомобиля может быть ноль или более владельцев. Класс Owners имеет имя, фамилию и т. д. атрибуты. Когда создается владелец, я устанавливаю его атрибут "carID" равным objectID автомобиля. Таким образом, вы можете определить количество владельцев автомобиля, запросив таблицу Owners, где carID соответствует определенному идентификатору автомобиля.

Теперь я хотел бы выполнить один запрос на выборку, который вернет все атрибуты автомобиля, а также новый атрибут, который не является столбцом в классе Car. Я хочу получить массив, содержащий объекты владельцев, связанные с автомобилем. Причина, по которой мне нужна эта информация в одном запросе, заключается в том, что я извлекаю несколько автомобилей одновременно, поэтому я не хочу делать запрос на получение владельцев для каждого автомобиля, который возвращается из этого запроса на выборку.

Это мой текущий запрос:

PFQuery *query = [PFQuery queryWithClassName:@"Car"];
[query whereKey:"color" equalTo:"red"];
[query findObjectsInBackgroundWithBlock:^(NSArray *cars, NSError *error) {
    //need to know which owners each car has had so I can access attributes of each owner here
    //without making a fetch request for every car in the "cars" array
}];

Как бы вы изменили запрос, чтобы получить нужные данные за одну выборку?


person Jordan H    schedule 23.05.2015    source источник


Ответы (2)


Включите в представление вашего автомобиля атрибут, называемый владельцами, который представляет собой массив указателей на класс владельца. Таким образом, вы можете легко найти владельцев как часть запроса автомобиля, используя includeKey:...

PFQuery *query = [PFQuery queryWithClassName:@"Car"];
[query includeKey:@"owners"];
[query findObjectsInBackgroundWithBlock:^(NSArray *cars, NSError *error) {
    for (PFObject *car in cars) {
        for (PFObject *owner in [cars objectForKey:@"owners"]) {
           // here we'll enumerate all of the owners for all of the cars
        }
    }
}];

И вы можете получить автомобили, принадлежащие данному владельцу, с помощью whereKey:equalTo:, который работает одинаково для столбцов с единственным числом и массивом...

PFObject *owner = // some owner
PFQuery *query = [PFQuery queryWithClassName:@"Car"];
[query whereKey:@"owners" equalTo:owner];
[query includeKey:@"owners"];
// etc.
person danh    schedule 23.05.2015

Наиболее эффективным способом было бы создать функцию CloudCode, а затем вызвать эту функцию из iOS.

person picciano    schedule 23.05.2015
comment
Это отличная рекомендация. Вы можете запросить дважды (что считается двумя запросами Parse), но это только один HTTP-запрос с устройства iOS, поэтому он быстрее и эффективнее. - person Clifton Labrum; 24.05.2015