2013-03-06 21 views
3

我有兩個解析班;公司和評級。這是一對多的關係。公司可以有很多評分。這是我在執行SQL語句:我想這在解析相當於Parse.js + AngularJS應用的關係型數據的查詢問題

SELECT Companies.name, Ratings.rating 
FROM Companies 
INNER JOIN Ratings 
ON Ratings.name_id = Companies.name_id 
ORDER BY Companies.name 

,但我不知道如何去做。這是我目前試過的:

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。這是我用我的角度視圖中的代碼:

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

如果我是大錯特錯此,請讓我知道

回答

5

擺脫在Ratingsname_id列。這不是你應該如何使用Parse定義關係的方法。

有幾個供您選擇的選項。

選項1

使用解析數據瀏覽器中,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

使用解析數據的瀏覽器,根據添加新列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")告訴解析到包括實際對象,而不是指向給定鍵的對象的指針。

結論

選項1是更好,如果你期待有大量的爲每個公司的收視率,如果你並不總是在每一次檢索所有的評級計劃你查詢的公司。

如果每家公司的評級數量相對較少,並且您總是希望在您查詢公司時收視率回來,則選項2會更好。

+0

非常感謝Lukas對你的文章的支持,現在你已經描述了它的意義。不過,我一直在嘗試你在這裏列出的第二個選項,但我似乎得到不正確的結果。它會返回整個收視率對象,並且我的評分將如下輸出:'[{「stars」:5,「objectId」:「V2NZoe64G2」,「createdAt」:「2013-03-08T18:54:05.372Z」 ,「updatedAt」:「2013-03-08T18:54:05.372Z」}]'using ratings.stars returns me undefined。 – Neil 2013-03-09 05:23:35

+0

所以你只需要'stars'屬性,而不是整個'rating'對象? – Lukas 2013-03-09 06:21:38

+0

TBH,我不確定。我不完全明白這裏發生了什麼。我認爲該公司的「收視率」正在被添加到「收視率」對象中嗎?我最終想做的是檢索平均評分......將所有「星星」加起來,除以總評分數。 – Neil 2013-03-09 16:31:41

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

+0

很高興知道!你是否遇到過使用angular和parse.com的許多令人頭痛的問題?我在問,因爲我目前正在比較BaaS選項。 – turbo2oh 2013-07-29 17:10:47