我有两个解析类;公司和评级。这是一对多的关系。公司可以有很多评级。这是我将在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);
}
});
}
我在控制器加载时调用此函数。此代码显示输出中的评级,但不显示公司名称。
我试图让所有公司列在公司对象中,然后将它们与评级对象中的所有评级配对。他们的共同关键是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>
如果我不在此基础上,请告诉我
答案 0 :(得分: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();
然后,在查询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会更好,并且当您查询公司时,您总是希望评级回来。
答案 1 :(得分:1)
我发现了如何解决Uncaught You can't add an unsaved Parse.Object to a relation.
错误。
var addRating = new Ratings({stars: rating}); // save rating first, then associate it with a company
addRating.save({
success: function() {
var addCompany = new Companies({name: name});
addCompany.relation("ratings").add(addRating);
addCompany.save();
}
});
评级必须先保存,然后公司关系可以在以后添加...有道理,但花了我一段时间才弄明白! :S