We have a Table name userProfile which has a pointer userId to User Table.
We are applying inner query on userProfile
PFQuery *query = [PFQuery queryWithClassName:#"UserProfile"];
[query whereKey:#"userId" equalTo:[PFUser currentUser]];
[query whereKey:#"relation" equalTo:#"Agent"];
[query includeKey:#"userId"];
[query includeKey:#"profileId.userId"];
query.skip = arrProfiles.count;
query.limit = 15;
NSString *searchText = [NSString stringWithFormat:#"%#",self.searchBar.text];
**PFQuery *innerQuery =[PFUser query];
[innerQuery whereKey:#"username" matchesRegex:[NSString stringWithFormat:#"(?i)%#",searchText]];
[query whereKey:#"userId" matchesQuery:innerQuery];**
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
}];
but we are unable to get any results after applying inner query.
In the query, you are saying that the userId has to be equal to the current user. But in the inner query, you are saying that the userId has to match the user with a username entered in the search field.
This means that the query has to satisfy BOTH constraints in order to return results. This can only happen if the current user is literally searching for themselves.
If you are looking for BOTH the current user's profile AND the searched-for profile, you need to use an or query like so:
PFQuery *firstQuery = [PFQuery queryWithClassName:#"UserProfile"];
[query whereKey:#"userId" equalTo:[PFUser currentUser]];
NSString *searchText = [NSString stringWithFormat:#"%#",self.searchBar.text];
PFQuery *innerQuery =[PFUser query];
[innerQuery whereKey:#"username" matchesRegex:[NSString stringWithFormat:#"(?i)%#",searchText]];
PFQuery *secondQuery = [PFQuery queryWithClassName:#"UserProfile"];
[secondQuery whereKey:#"userId" matchesQuery:innerQuery];
PFQuery *query = [PFQuery orQueryWithSubqueries:[firstQuery, secondQuery]];
[query whereKey:#"relation" equalTo:#"Agent"];
[query includeKey:#"profileId.userId"];
query.skip = arrProfiles.count;
query.limit = 15;
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
}];
Related
I am trying to find all posts by the current user. When I add the line [query whereKey:#"user" equalTo:[PFUser user]]; the query does not even get executed, since "retrieving posts?" never prints to the console. When I comment out [query whereKey:#"user" equalTo:[PFUser user]]; it works just fine. What am I doing wrong?
PFQuery *query = [PFQuery queryWithClassName:#"Post"];
[query orderByDescending:#"createdAt"];
[query includeKey:#"filter"];
[query whereKey:#"user" equalTo:[PFUser user]];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
NSLog(#"retrieving posts?");
...
}];
I don't know the obj-c but the correct implementation in Swift would be:
query.whereKey("user", equalTo: PFUser.currentUser())
I was trying this
PFQuery *allDealsQuery = [Deal query];
PFRelation *favoritedDealsRelation = [user objectForKey:#"favoritedDeals"];
PFQuery *favoritedDealsQuery = [favoritedDealsRelation query];
PFRelation *redeemedDealsRelation = [user objectForKey:#"redeemedDeals"];
PFQuery *redeemedDealsQuery = [redeemedDealsRelation query];
[allDealsQuery whereKey:#"objectId" doesNotMatchKey:#"objectId" inQuery:favoritedDealsQuery];
//Parse does not support more than 2 where queries???
[allDealsQuery whereKey:#"objectId" doesNotMatchKey:#"objectId" inQuery:redeemedDealsQuery];
[allDealsQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
if (!error) {
onSuccess(objects);
}
else {
onError(error);
}
}];
When I tried to use two queries, the answer was different from what was expected.
So should I use be using only one doesNotMatchKey query?
Try referencing parse documentation on Compound Queries:
https://parse.com/docs/ios_guide#queries-compound/iOS
Compound Queries
If you want to find objects that match one of several queries, you can use orQueryWithSubqueries: method. For instance, if you want to find players with either have a lot of wins or a few wins, you can do:
PFQuery *lotsOfWins = [PFQuery queryWithClassName:#"Player"];
[lotsOfWins whereKey:#"wins" greaterThan:#150];
PFQuery *fewWins = [PFQuery queryWithClassName:#"Player"];
[fewWins whereKey:#"wins" lessThan:#5];
PFQuery *query = [PFQuery orQueryWithSubqueries:#[fewWins,lotsOfWins]];
[query findObjectsInBackgroundWithBlock:^(NSArray *results, NSError *error) {
// results contains players with lots of wins or only a few wins.
}];
I'm having problem while caching query. Below is the code I am using for my query. If i comment out [query whereKey:#"login" equalTo:currentUser.login] the query is caching fine.
//Defining the query
+(PFQuery *)queryForListingForCurrentUser{
PFQuery *query = [Listings query];
BOOL hasCache = [query hasCachedResult];
NSLog(hasCache ? #"yes": #"no");
User *currentUser = (User *)[PFUser currentUser];
[query whereKey:#"login" equalTo:currentUser.login];
query.cachePolicy = kPFCachePolicyNetworkElseCache;
return query;
}
//Calling the query
PFQuery *query = [Listings queryForListingForCurrentUser];
[query findObjectsInBackgroundWithBlock:^(NSArray *array, NSError *error){
}];
I would like to make a search feature that queries two different key from the same class. What kind of regular expression could I use that return the most accurate values. Example:
- (void)searchTableList {
[self.results removeAllObjects];
PFQuery *query = [PFQuery queryWithClassName:#"TC"];
CLLocationCoordinate2D coordinate = [self.delegate.location coordinate];
PFGeoPoint *geoPoint = [PFGeoPoint geoPointWithLatitude:coordinate.latitude
longitude:coordinate.longitude];
PFQuery *query1 = [PFQuery queryWithClassName:#"TC"];
[query1 setLimit:1000];
[query1 whereKey:#"location"
nearGeoPoint:geoPoint
withinKilometers:5];
[query1 whereKey:#"courses" matchesRegex:[NSString stringWithFormat:#"%#",[self.searchBar.text lowercaseString]]];
[query1 whereKey:#"owner" notEqualTo:[PFUser currentUser].username];
[query1 findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
for( PFObject * object in objects)
{
[self.results addObject:object];
}
[query setLimit:1000];
[query whereKey:#"location"
nearGeoPoint:geoPoint
withinKilometers:5];
[query whereKey:#"owner" matchesRegex:[NSString stringWithFormat:#"%#",[self.searchBar.text lowercaseString]]];
[query whereKey:#"owner" notEqualTo:[PFUser currentUser].username];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
for( PFObject * object in objects)
{
[self.results addObject:object];
}
[self.tableView reloadData];
}];
}];
}
How could I take these two queries and order them in such a way that the most accurate information has priority.
If you want to find objects that match one of several queries, you can use orQueryWithSubqueries: method. For instance, if you want to find players with either have a lot of wins or a few wins, you can do:
PFQuery *lotsOfWins = [PFQuery queryWithClassName:#"Player"];
[lotsOfWins whereKey:#"wins" greaterThan:#150];
PFQuery *fewWins = [PFQuery queryWithClassName:#"Player"];
[fewWins whereKey:#"wins" lessThan:#5];
PFQuery *query = [PFQuery orQueryWithSubqueries:#[fewWins,lotsOfWins]];
[query findObjectsInBackgroundWithBlock:^(NSArray *results, NSError *error) {
// results contains players with lots of wins or only a few wins.
}];
I have a Parse class called FriendRelation. This class has two users, one a friend the other a user.
I want to get all of the messages posted by all of the friends of a user. I am attempting to do so with the following query:
PFQuery *innerQuery = [PFQuery queryWithClassName:#"FriendRelation"];
[innerQuery whereKey:#"user" equalTo:currentUser];
PFQuery *query = [PFQuery queryWithClassName:#"Message"];
[query whereKey:#"userMessage" matchesQuery:innerQuery];
[query findObjectsInBackgroundWithBlock:^(NSArray *comments, NSError *error) {
}];
This query comes back with no results.
I believe this is occurring because of the line:
[query whereKey:#"userMessage" matchesQuery:innerQuery];
The where key needs to be a FriendRelation to match. Is this correct?
How can I make the results of the inner query be a user that will intern match the matching query?
Thanks!
You can try using
- (void)whereKey:(NSString *)key matchesKey:(NSString *)otherKey inQuery:(PFQuery *)query
Something like:
PFQuery *innerQuery = [PFQuery queryWithClassName:#"FriendRelation"];
[innerQuery whereKey:#"user" equalTo:currentUser];
PFQuery *query = [PFQuery queryWithClassName:#"Message"];
[query whereKey:#"userMessage" matchesKey:#"firendUser" inQuery:innerQuery];
[query findObjectsInBackgroundWithBlock:^(NSArray *comments, NSError *error) {
//do something useful..
}];
Let me know how it goes!