2015-05-23 1 views
1

Представьте гипотетический случай, когда у меня есть класс Car, который содержит такие атрибуты, как цвет, бренд и т. Д. Автомобиль может иметь ноль или более владельцев. Класс Ownerers имеет имя, фамилию и т. Д. Атрибуты. Когда владелец создается, я устанавливаю его атрибут carID равным идентификатору объекта автомобиля. Поэтому вы можете определить количество владельцев, которых имел автомобиль, запросив таблицу владельцев, где carID соответствует определенному идентификатору автомобиля.Получение данных из двух классов в одном PFQuery

Теперь я хотел бы выполнить один запрос на выборку, который будет возвращать все атрибуты автомобиля, а также новый атрибут, который не является столбцом класса 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 
}]; 

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

ответ

0

В вашем представлении автомобиля есть атрибут, называемый владельцем, который представляет собой массив указателей на класс владельца. При том, что вы можете получить владелец охотно, как часть запроса автомобиля с помощью 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. 
1

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

+0

Это отличная рекомендация. Вы можете запросить дважды (что считается двумя запросами Parse), но это только один HTTP-запрос с устройства iOS, поэтому он быстрее и эффективнее. –

Смежные вопросы