3

2 つの解析クラスがあります。会社と格付け。これは 1 対多の関係です。企業は多くの評価を持つことができます。これは、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>

これに基づいていない場合は、お知らせください

4

2 に答える 2

5

クラスname_id内の列を取り除きます。Ratingsこれは、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")指定されたキーのオブジェクトへのポインターではなく、実際のオブジェクトを含めるように Parse に指示します。

結論

オプション 1 は、企業ごとに大量の評価が予想される場合や、企業にクエリを実行するたびにすべての評価を取得する予定がない場合に適しています。

オプション 2 は、各企業の評価数が比較的少なく、企業をクエリしたときに常に評価を返したい場合に適しています。

于 2013-03-07T16:35:58.270 に答える
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

于 2013-03-11T16:34:37.470 に答える