hideki
hideki

Reputation: 113

Parse Relational Queries

I am struggling with Parse Relational Queries.

What I want to do: To query all Recipes that current ParseUser likes.

Models (Pseudo code to simplify) There are two classes. One is Recipe class, another one is Like class that has information of who likes which recipe.

@ParseClassName("Like")
public class Like ParseObject{
    "fromUser" : ParserUser 
    "toRecipe": Recipe
}

@ParseClassName("Recipe")
public class Recipe : ParseObject {
    "objectId": String // from ParseObject
    // some other field.
}

I have tried both whereMatchesQuery() and whereMatchesKeyInQuery() methods. But both query results are an empty list. Does someone know how to query to meet my requirement?

Case of using ParseQuery.whereMatchesQuery()

ParseQuery<Like> likesQuery = ParseQuery.getQuery(Like.class);
likesQuery.whereEqualTo("fromUser", ParseUser.getCurrentUser());
ParseQuery<Recipe> recipesQuery = ParseQuery.getQuery(Recipe.class);
recipesQuery.whereMatchesQuery("toRecipe",  likesQuery);
recipesQuery.find() <- Return Empty List

Case of using ParseQuery.whereMatchesKeyInQuery()

ParseQuery<Like> likesQuery = ParseQuery.getQuery(Like.class);
likesQuery.whereEqualTo("fromUser", ParseUser.getCurrentUser());
ParseQuery<Recipe> recipesQuery = ParseQuery.getQuery(Recipe.class);
recipesQuery.ParseQuerywhereMatchesKeyInQuery("objectId", toRecipe", likesQuery);
recipesQuery.find() <- Return Empty List

Upvotes: 1

Views: 125

Answers (1)

natario
natario

Reputation: 25204

With the current design, it seems you can only fetch likes and then get Recipes with get:

ParseQuery<Like> likesQuery = ParseQuery.getQuery(Like.class);
likesQuery.whereEqualTo("fromUser", ParseUser.getCurrentUser());
List<Like> likes = likesQuery.find();
List<Recipe> recipes = new ArrayList(likes.size());
for (Like like : likes) {
    recipes.add(like.getRecipe());
}

You can use query.include() to include the recipe object in the query results.

Another option is to add a recipe id field to likes:

@ParseClassName("Like")
public class Like ParseObject {
    "fromUser" : ParserUser 
    “toRecipe” : Recipe
    "toRecipeId": String
}

If you do this, you can use your second suggestion with whereMatchesKeyInQuery.

Upvotes: 1

Related Questions