J'ai une classe à analyser, disons Pictures. Chacun de ceux-ci appartient à un utilisateur. Les références à cet utilisateur sont stockées dans la table/classe Pictures sous la forme d'une Pointer
pour l'utilisateur.
Dans mon code de nuage, j'essaie d'obtenir toutes les images appartenant à un utilisateur à l'aide d'une clé principale. Voici mon code:
Parse.Cloud.define("getPictures", function(request, response) {
Parse.Cloud.useMasterKey();
var query = new Parse.Query("Pictures");
query.equalTo("user", request.params.user);
query.find({
success: function(results) {
var status = "Found " + results.length + " pictures for userId " + request.params.user;
response.success(status);
},
error: function() {
status = "No pictures exist for userId " + request.params.user;
response.error(status);
}
});
});
Ce code indique qu'il y a 0 images pour un utilisateur avec l'ID 'xyz' par exemple. Cependant, je peux voir que l'utilisateur a beaucoup d'images stockées.
J'ai également vérifié que le problème ne venait pas de l'utilisation de la clé principale, car je vois dans le journal de la console que le code est exécuté en tant que maître. De plus, si je demande une image par objectId
, elle apparaîtra dans les résultats, ce qui signifie qu'ACL n'est pas le problème ici.
Je pense que je dois utiliser les relations/rejoindre ici, mais je ne sais pas comment faire cela.
Les pointeurs sont stockés en tant qu'objets dans la base de données Parse. Par conséquent, si vous essayez de comparer une chaîne à un objet doté de la fonction query.equalTo()
, rien ne sera trouvé. Voici comment sont stockés les pointeurs:
{
__type: 'Pointer',
className: '_User',
objectId: user-object-id
}
Si vous interrogez une classe avec des pointeurs et souhaitez que votre résultat arrive avec tout l'objet imbriqué, vous devez définir ceci dans votre requête:
var query = new Parse.Query('Pictures');
query.include('user');
Dans mes requêtes lorsque je souhaite effectuer une recherche par colonne de pointeur, je compare mon objet utilisateur à l'objet utilisateur imbriqué.
var user = new Parse.User();
// Set your id to desired user object id
user.id = your-user-id;
var query = new Parse.Query('Pictures');
// This include will make your query resut comes with the full object
// instead of just a pointer
query.include('user');
// Now you'll compare your local object to database objects
query.equalTo('user', user);
query.find({
success: function(userPicture) {
response.success(userPicture);
}
});
Quoi qu'il en soit, il semble que si vous avez plusieurs images liées à un utilisateur, vous recherchez probablement des relations d'analyse au lieu de pointeurs: https://www.parse.com/docs/relations_guide
Si vous écrivez une requête pour récupérer un objet parent et un objet enfant sur lequel vous avez un pointeur, mais sans accès en lecture conformément à la liste de contrôle d'accès, la requête peut renvoyer uniquement l'objet parent et l'enfant sera null, car la liste de contrôle d'accès ne vous permettra pas de le lire.
Il peut y avoir un problème avec vos paramètres. Si "utilisateur" est un pointeur, alors "request.params.user" est incorrect, car PFObjects peut ne pas être envoyé en tant que paramètre. Si "utilisateur" est un pointeur, utilisez "request.user". Si request.params.user est une chaîne de l'ID utilisateur, vous pouvez utiliser l'ID pour reconstruire un shell PFObject avant la requête, comme suggéré par Murilo, mais supprimer le paramètre "utilisateur" et utiliser request.user raccourcirait votre code et ne dupliquez aucune valeur. La solution de Murilo est également intéressante car vous pouvez transmettre un ID utilisateur autre que l'identifiant de l'utilisateur actuel.