简体   繁体   中英

many-to-many relation on Parse.com Cloud Code

I have a class "Team", which can have many Users.

I need to create a from/to relation every time a user is added to a Team. Every user can rate and be rated by all his teammates.

This is my Cloud code. I can't seem to get this working.

// add Team relations for every saved player
Parse.Cloud.afterSave("Team", function(request) {

    // Team being saved
    var team = request.object,
        relation = team.relation("players"),
        query = relation.query();

        query.find({

            // players on this Team
            success: function(results) {

                // all players on this Team
                var i, j, player, teammate;
                for (i = 0; i < results.length; i++) {
                    player = results[i];

                    // for each player add a new Rate relation (from/to)
                    for (j = 0; j < results.length; j++) {
                        teammate = results[i];

                        // if it's same player, escape relation
                        if (player == teammate) { continue; }

                        var Rate = Parse.Object.extend("Rate"),
                            rate = new Rate();

                        // create the relation from this player
                        var fromRelation = rate.relation('from');
                            fromRelation.add(player);

                        // to every other player on the team
                        var toRelation = rate.relation('to');
                            toRelation.add(teammate);

                            rate.save(null, {
                                success: function(_team) {

                                },
                                error: function(_team, error) {

                                }
                            });
                    }
                }

                response.success('rate relation success');

            },
            error: function(error) {
                response.error('rate relation error');
            }
        });

});

Adding a player to a team is working great, it runs on Client side.

Classes setup on Data Browser: 团队班 费率等级

Your class is "Rates" but you are using this code:

 var Rate = Parse.Object.extend("Rate"),
                        rate = new Rate();

change to

 var Rate = Parse.Object.extend("Rates"),
                        rate = new Rate();

Also, make sure your object is created before adding a relation.

                        var Rate = Parse.Object.extend("Rate"),
                        rate = new Rate();

                           [.... MOVED BELOW .....}

                        rate.save(null, {
                            success: function(_team) {
                           [.... now create and save relations ...]
                            },

Solved it this way.

The only thing annoying me is the fact that if I try this, I get an error:

"fromRelation is expecting _User, but got _Team", why?

player = results[i];
var fromRelation = rate.relation('from');
fromRelation.add(player);

I had to create 2 new vars, fromPlayer and toPlayer, although it seems dumb to me, anyway it works.

Parse.Cloud.define("updateTeamPlayers", function(request, response) {
    var Team = Parse.Object.extend("Team"),
        team = new Team();
        team.id = request.params.id;

    var relation = team.relation("players"),
        query = relation.query();

    query.find({
        success: function(results) {
            var i, j, player, teammate, queryArray = [], teammateRes = results;

            for (i = 0; i < results.length; i++) {
                player = results[i];

                // for each player add a new Rate relation (from/to)
                for (j = 0; j < teammateRes.length; j++) {
                    teammate = teammateRes[j];

                    // if it's same player, escape relation
                    if (player == teammate) { continue; }

                    var Rate = Parse.Object.extend("Rates"),
                        rate = new Rate();

                    // create the relation from this player
                    var fromPlayer = new Parse.User();
                        fromPlayer.id = player.id;

                    var fromRelation = rate.relation('from');
                        fromRelation.add(fromPlayer);

                    // to every other player on the team
                    var toPlayer = new Parse.User();
                        toPlayer.id = teammate.id;

                    var toRelation = rate.relation('to');
                        toRelation.add(toPlayer);

                    queryArray.push(rate);
                }
            }

            Parse.Object.saveAll(queryArray, {
                success: function(_allsaved) {
                    response.success('rate save success:' + _allsaved);
                },
                error: function(error) {
                    response.error('rate save error:' + error + ' =|= ' + error.message);
                }
            });

            // end suucess
        },
        error: function() {
            response.error("team failed");
        }
    });
});

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM