Parse.js + AngularJS应用程序关系数据查询问题

Nei*_*eil 3 parsing angularjs parse.js

我有两个解析类; 公司和评级.这是一对多的关系.公司可以有很多评级.这是我将在SQL中执行的语句:

SELECT Companies.name, Ratings.rating
FROM Companies
INNER JOIN Ratings
ON Ratings.name_id = Companies.name_id
ORDER BY Companies.name
Run Code Online (Sandbox Code Playgroud)

我想在Parse中相当于这个,但我不确定如何去做.这是我目前正在尝试的内容:

function getRatings() {
  var tableA = new Parse.Query(Companies);
  var tableB = new Parse.Query(Ratings);

  tableB.equalTo("name_id", tableA.name_id);
  tableB.find({
    success: function(results) {
      $scope.$apply(function() {
        $scope.companies = results.map(function(obj) {
          return {
            id: obj.get("name_id"), 
            name: obj.get(tableA.name), 
            rating: obj.get("rating"), 
            parseObject: obj
          };
        });
      });
    },
    error: function(error) {
      alert("Error: " + error.code + " " + error.message);
    }
  });
}
Run Code Online (Sandbox Code Playgroud)

我在控制器加载时调用此函数.此代码显示输出中的评级,但不显示公司名称.

我试图让所有公司列在公司对象中,然后将它们与评级对象中的所有评级配对.他们的共同关键是name_id.这是我在Angular视图中使用的代码:

<div class="span12">
    <div ng-repeat="company in companies | filter: query | orderBy: orderList" 
         class="well company-description">
        <h1>{{company.name}}</h1>
        <h3>Rating: {{company.rating}}</h3>
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

如果我基于此,请告诉我

Luk*_*kas 5

摆脱课堂上的name_id专栏Ratings.这不是你应该如何使用Parse定义关系.

有几个选项供您选择.

选项1

使用Parse数据浏览器,在Companies类下添加一个名为的新列ratings.它应该是一个类型的列,Relation并指向Ratings目标类.(如果您需要有关如何执行此操作的更多信息,请与我们联系.)

然后,在创建或编辑公司时,添加评级,如下所示:

var Companies = Parse.Object.extend("Companies");
var Ratings = Parse.Object.extend("Ratings");

var company = new Companies({name: "Some Company"});
company.relation("ratings").add(new Ratings({stars: 5}));
company.save();
Run Code Online (Sandbox Code Playgroud)

然后,在查询时Companies,请执行以下操作:

new Parse.Query(Companies).find({
    success: function(companies) {
        for (var i = 0; i < companies.length; i++) {
            companies[i].relation("ratings").query().find({
                success: function(ratings) {
                    // Finally, I have the ratings for this company
                }
            }
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

选项2

使用Parse数据浏览器,在Companies类下添加一个名为的新列ratings.它应该是一个类型的列Array.

然后,在创建或编辑公司时,添加评级,如下所示:

var Companies = Parse.Object.extend("Companies");
var Ratings = Parse.Object.extend("Ratings");

var company = new Companies({
    name: "Some Company",
    ratings: [new Ratings({stars: 5})]
});
company.save();
Run Code Online (Sandbox Code Playgroud)

然后,在查询时Companies,请执行以下操作:

new Parse.Query(Companies).include("ratings").find({
    success: function(companies) {
        // Yay, I have access to ratings via companies[0].get("ratings")
    }
});
Run Code Online (Sandbox Code Playgroud)

include("ratings") 告诉Parse包含实际的对象,而不是指向给定键的对象的指针.

结论

如果您希望每家公司都有大量评级,并且每次查询公司时并不总是计划检索所有评级,那么选项1会更好.

如果每个公司的评级数量相对较少,则选项2会更好,并且当您查询公司时,您总是希望评级回来.