2015-12-22 4 views
5

私は古典的なORMの問題に悩まされているようで、実際にどのように扱うかわからないので、この時点で助けを歓迎します。ループバックリレーショナルデータベースhasManyThroughピボットテーブル

hasManyThroughクエリでピボットテーブルを取得する方法はありますか?さらに良い方法は、フィルタを適用するか、フィルタを並べ替えることです。典型的な例

表製品

id,title 

表カテゴリ

id,title 

テーブルproducts_categories

productsId, categoriesId, orderBy, main 

ので、上記のシナリオでは、あなたが製品のすべてのカテゴリを取得したいと言いますXが(main = true)、または商品カテゴリをorderBy。実際のカテゴリを取得するカテゴリのcategoriesIdと最終SELECTを取得するには、製品データを取得するための製品の最初のSELECTで今products_categories上の第二SELECTをどうなり

。理想的には、フィルタおよびソートが別の典型的な例は、あなたがproducts_imagesを持っているでしょう

に、ユーザがそれら望んでいる順序に基づいて製品イメージを注文したいことでしょう

SELECT `id`,`productsId`,`categoriesId`,`orderBy`,`main` FROM `products_categories` WHERE `productsId` IN (180) WHERE main = 1 ORDER BY `orderBy` DESC 

のように第二SELECTに適用されなければなりませんテーブル

id,image,productsID,orderBy 

、あなたが

SELECT from products_images WHERE productsId In (180) ORDER BY orderBy ASC 
したいと思います3210

それは可能ですか?

EDIT:私のスキーマに基づいて必要なものを得るために中間テーブルに必要な関係は次のとおりです。

Products.hasMany(Images, 
    { 
     as: "Images", 
     "foreignKey": "productsId", 
     "through": ProductsImagesItems, 
     scope: function (inst, filter) { 
      return {active: 1}; 
     } 
    }); 

機能は、私に最終結果にアクセスして中間テーブルにアクセスできないようにする機能です。

+0

中間テーブルとはどういう意味ですか?私が言ったように、あなたはテーブルを忘れる必要があります、ループバックは、その上に抽象化を提供しています。モデルのプロパティを読み書きするか、別のモデル(例:Product n°5)から関連するモデル(Inst。for Inst。)を識別したい。 – Overdrivr

答えて

4

私はあなたの問題を完全に理解しているとは確信していませんが、実際にはテーブルのコンセプトから離れ、モデルと関係の点で問題を表明する必要があります。

私はそれを見て、Product(プロパティ:title)とCategory(プロパティ:main)の2つのモデルを持っています。

その後、次の2つの間の関係を持つことができ、潜在的に

  • Product belongsTo Category
  • Category hasMany Product

このカテゴリには多くの製品が含まれているかもしれないが、製品は、単一のカテゴリーに属していることを意味します。other relations available

は、あなたがそれらのプロパティ(あなたのケースでmainをのような)の関数でアイテムを取得するためにGET要求をフィルタリングすることができ、またはに(あなたが関係を追加するときに自動的に生成された)要求をGETカスタム使用生成されたREST APIを使用して、次にあります。たとえば、特定のカテゴリに属する​​すべての製品を取得します。

これは役に立ちますか?

3

ここにある内容に基づいて、関係を定義するときにscopeオプションを使用することをおすすめします。ループバックのドキュメントは非常に似example of the "product - category" scenarioを示しています。

Product.hasMany(Category, { 
    as: 'categories', 
    scope: function(instance, filter) { 
     return { type: instance.type }; 
    } 
}); 

上記の例では、instanceが一致しているカテゴリーであり、各製品がそのProductのためのマッチングCategoryエンティティを含むことになり、新たなcategories性質を持っているでしょう。これはあなたの正確なデータスキームに従わないので注意してください。また、私は(それらがデフォルトで含まれていません)あなたのAPIのクエリを使用すると、ロードされたcategories関連のデータが欲しいことを指定しなければならないと思う:

/api/Products/13?filter{"include":["categories"]}

+0

私はその道を歩いているが成功していない。つまり、私は中間テーブルと構文のスコープを指定する必要があります。あなたと私の例は、最終的なモデルへのアクセスを提供します。私はこの時点で何かを除外することができると思いますが、あなたは既にDBに問い合わせているので効率的ではありません。私はクエリーを更新して、クエリーを実行するために必要な関係のサンプルを提供しました – mbouclas

2

私はあなたがProduct.jsでカスタム/リモートメソッドを定義示唆しますそれはあなたのための仕事です。

Product.getCategories(_productId){ 
    // if you are taking product title as param instead of _productId, 
    // you will first need to find product ID 
    // then execute a find query on products_categories with 
    // 1. where filter to get only main categoris and productId = _productId 
    // 2. include filter to include product and category objects 
    // 3. orderBy filter to sort items based on orderBy column 

    // now you will get an array of products_categories. 
    // Each item/object in the array will have nested objects of Product and Category. 
} 
+0

これは確かにそれについての1つの方法ですが、ループバックの関係の全体を無視しています。私はそれについてより多くの "ループバック"方法を探していました。あなたのDBがMongoかNoSQLかどうかは、referencesMany関係を使用することで可能ですが、それはSQLのやり方で行うことができます – mbouclas