2017-02-22 7 views
5

LoopBack -applicationからREST-Apiを介して特定のモデルのレコードを照会したいとします。また、私はインクルードフィルターを介して関連するオブジェクトを含めるしたい。 これは正常に動作しますが、すべての関連オブジェクトを返します。それらを制限することは可能ですか?また関連オブジェクトのフィールドでそれらを注文することは可能ですか?ループバックでインクルードフィルターとの関係のレコードを制限する方法はありますか?

モデル:

- DEPARTMENT 
    Fields: 
     - id 
     - name 
     - ... 
    Relations_ -> hasMany: Messages 
    Relations_ -> hasMany: Members 

- MESSAGE 
    Fields: 
     - id 
     - senderId 
     - body 
     - ... 

- MEMBER 
    Fields: 
     - id 
     - email 
     - ... 

クエリ:

私が達成したいどのようなすべてのメンバーとすべての部門を照会することですが、特定のフィールド(作成されたタイムスタンプ)が注文した最後のメッセージ。

最初のアプローチは、GETリクエストのプレーンなクエリ文字列バリアントのようになります。

http://loopback-server:3000/api/departments?filter[include]=members&filter[include]=messages 

これは、すべてのメッセージと、すべてのメンバーとすべての部門を返します。 。しかし、私はMESSAGE-モデルの特定のフィールドでソートされた最後の1(または最後の5または何に返されるメッセージの数を制限したい

を私はまたjsonfiedクエリ構文を試してみました:

http://loopback-server:3000/api/departments?filter={"include":{"relation": "messages","limit":1}} 

残念ながら、メッセージの関係に "limit"パラメータは使用されていません。

次の亜種は最初の部門のみを返します。つまり、リレーションモデルではなく、departments-modelに適用されます。

http://loopback-server:3000/api/departments?filter={"include":{"relation": "messages"},"limit":1} 

それから私は -parameter 範囲を発見し、これを試してみました:

http://loopback-server:3000/api/departments?filter={"include":{"relation": "messages","scope":{"limit":1, "skip":0}}} 

これは本当に奇妙な結果を与えます。これは、1つのメッセージを返す1つの特定のレコード(10を超える)を返すのではなく、部門に関連するすべてのメッセージを排除します。 scope-parameterを削除すると、各部門に実際に多数のメッセージがあることがわかります。

(私は{「」}のように、これらすべての特殊文字をURLのパラメータがあることを知っています。URLエンコードする必要があり、私は読みやすくするため、ここできれいに残す)

私の質問:

1回のリクエストでどのようにクエリを実行するのですか?

+1

https://loopback.io/doc/en/lb3/Include-filter.html#include-with-filtersをご覧ください –

答えて

2

リレーションシップをプロパティで照会することはできません(まだ)。制限については、スコープを使用して、最後のアプローチを少し変更する必要があります。ここでは、その性質によって関係に対するクエリについて読むことができます

"scope":{{"include":{"relation": "messages","limit":1, "skip":0}}} 

https://github.com/strongloop/loopback/issues/517

+0

これを信じることができません! – octavian

1

私はどのバージョンにあなたを知りませんがループバック3のためにあります

あなたはこれを行うことができます。

include: { 
    { 
     relation: 'Messages', // include the messages object 
     scope: { // this is where you do a normal filter 
      where: {<whatevercondition>}, 
      order: "<fieldname> <ASC/DESC>", 
      limit:1, 
      include:{ 
       //yes, you can include 3rd level relation as well. 
      } 
     } 
    }, 
    { 
     relation: 'Members', // include the Members object 
     scope: { // further filter the related model 
      order: "<fieldname> <ASC/DESC>", 
      limit: <whateverlimityoument> 
     } 
    } 
} 
関連する問題