parsing - Parse.js + AngularJS app关系数据查询问题

标签 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

我想要 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);
    }
  });
}

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

我正在尝试获取公司对象中列出的所有公司,然后将它们与评级对象中的所有评级配对。他们的共同 key 是name_id。这是我在 Angular View 中使用的代码:

<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>

如果我在这方面有偏差,请告诉我

最佳答案

去掉 Ratings 类中的 name_id 列。这不是您应该使用 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();

然后,在查询 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
                }
            }
        }
    }
});

选项 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();

然后,在查询 Companies 时,按如下方式进行:

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

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

结论

如果您希望每个公司都有大量评级,并且您不总是计划在每次查询公司时都检索所有评级,则选项 1 更好。

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

关于parsing - Parse.js + AngularJS app关系数据查询问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15258075/

相关文章:

javascript - 为 javascript 代码编写解析器

javascript - angular.copy() 在 setTimeout() 中不起作用

javascript - AngularJS 动态添加选项卡到垂直选项卡表

javascript - 带双点的 Angular 电子邮件验证

Javascript 返回值而不打破循环

parsing - 是否有可能有一个语法,其中 "keyword"也可以被视为 "non-keyword"?

java - 这个解析器生成器说这个语法不是 LR(1) 但我有疑问

java - JOptionPane 输入对话框如何决定值是 2 还是 JOptionPane.CANCEL_OPTION