Простой способ получить несколько связанных объектов в Parse.com с помощью Javascript?
У меня есть класс Player. Игроки могут иметь x количество трофеев. У меня есть объект PlayerId и вам нужно получить список всех своих трофеев.
В браузере данных Parse.com объект Player имеет столбец с надписью:
trophies Relation<Trophy>
(view Relations)
Кажется, это должно быть так просто, но у меня проблемы с ним.
У меня есть плеер Player ParseObject:
var query = new Parse.Query("Trophy");
query.equalTo("trophies", player);
query.find({
/throws an error- find field has invalid type array.
Я также пробовал реляционные запросы:
var relation = new Parse.Relation(player, "trophies");
relation.query().find({
//also throws an error- something about a Substring being required.
Это должно быть полностью общей задачей, но я не могу понять, как это сделать.
Кто-нибудь знает, как это сделать в Javscript CloudCode?
Большое спасибо!
ИЗМЕНИТЬ -
Я могу делать реляционные запросы на пользователя в порядке:
var user = Parse.User.current();
var relation = user.relation("trophies");
relation.query().find({
Я не понимаю, почему этот же самый бит кода ломается, если я использую не-пользовательский объект.
Ответы
Ответ 1
Я, наконец, разобрал это, хотя есть предостережение, которое делает эту работу иначе, чем указывает документация.
//Assuming we have 'player', an object of Class 'Player'.
var r = player.relation("trophies");
r.query().find({
success: function(trophies){
response.success(trophies); //list of trophies pointed to by that player "trophies" column.
},
error: function(error){
response.error(error);
}
})
Предостережение: У вас должен быть "полный" игровой объект в памяти, чтобы это работало. Вы не можете сохранить объект игрока, захватить объект из обратного вызова успеха и выполнить эту работу. По какой-то причине объект, возвращаемый в обработчик успеха, представляется неполным Parse.Object и не хватает некоторых методов, необходимых для этого.
Еще один камень преткновения о Parse.com Javascript SDK. Запрос, который ничего не находит, по-прежнему считается успешным. Поэтому каждый раз, когда вы запрашиваете что-то, вы должны проверить длину ответа на большее, чем 0, потому что успешный запрос ничего не мог вернуть.
Ответ 2
Это то, что сработало для меня:
var Comment = Parse.Object.extend("Comment");
var commentsQuery = new Parse.Query(Comment);
commentsQuery.equalTo("parent", video);//for the given 'video' instance, find its children (comments)
commentsQuery.descending("createdAt");
return commentsQuery.find();
Примечание: конечно, video
является экземпляром класса Video. И возврат find()
означает, что мне придется обрабатывать "обещание" в любой функции, вызывающей эту функцию.
И вот другая функция, идущая под другим углом:
getRecentCommentsOfAllVideos: function(limit) {
var Comment = Parse.Object.extend("Comment");
var commentsQuery = new Parse.Query(Comment);
commentsQuery.descending("createdAt");
commentsQuery.limit(limit);
commentsQuery.include("parent");//this enables the details of the comment associated video to be available in the result
return commentsQuery.find();
}
(Обязательно прочитайте https://parse.com/docs/js_guide и найдите строку, в которой говорится: "Включите почтовые данные с каждым комментарием".)
Я также рассмотрел эти материалы; возможно, они вам помогут (хотя они мне не очень помогают):