2017-02-22 32 views
5

Chcę zapytać o rekordy od określonego modelu poprzez REST-Api z LoopBack -application. Również chcę dołączyć obiekty pokrewne za pomocą filtra włączania. Działa to dobrze, ale zwraca WSZYSTKIE powiązane obiekty. Czy jest możliwe ich ograniczenie, a także uporządkowanie ich przez pole powiązanych obiektów?Jak ograniczyć rekordy relacji z funkcją sprzężenia zwrotnego w pętli sprzężenia zwrotnego?

Modele:

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

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

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

Zapytania:

Co chcę osiągnąć jest do kwerendy wszystkich działów ze wszystkich swoich członków, ale tylko ostatnia wiadomość sortowane według określonej dziedzinie (utworzony-timestamp).

Pierwsze podejście może być zwykły wariant query string z GET-Request:

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

ta zwróci wszystkie działy ze wszystkimi wiadomościami i wszystkich członków. Jednak chciałbym, aby ograniczyć liczbę zwracanych komunikatów do ostatniego (lub ostatnich 5 lub cokolwiek, posortowane według określonego pola Message-modelu

Próbowałem też jsonfied składni kwerendy.

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

Niestety „granica” -parameter nie służy tu do relacji wiadomości.

Poniższy wariant powróci tylko pierwszy dział, czyli granica-param jest stosowany do działów model, a nie modelu relacja.

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

Wtedy odkryłem zakresu-parameter i próbowałem to:

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

Daje to naprawdę dziwny wynik. To anuluje wszystkie wiadomości związane z działami, zamiast jednego konkretnego rekordu zwracającego jedną wiadomość (ma ponad 10), czego oczekiwałbym. Usunięcie parametru scope pokazuje, że działy rzeczywiście mają wiele komunikatów.

(wiem, że parametry adresu URL z tych wszystkich znaków specjalnych, takich jak { „:”} muszą być url zakodowane zostawiam go w czystości tu dla lepszej czytelności.)

Moje pytanie:

Jak uzyskać to zapytanie z pojedynczym żądaniem?

+1

Proszę spojrzeć na https://loopback.io/doc/en/lb3/Include-filter.html#include-with-filters –

Odpowiedz

2

Nie można wyszukiwać relacji według ich właściwości (jeszcze). Jeśli chodzi o limit, Twoja ostatnia podejście z zakresu należy zmodyfikować trochę:

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

Tutaj można przeczytać o zapytaniach o stosunkach według ich właściwości:

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

+0

Nie mogę w to uwierzyć! – octavian

1

Nie wiem jaka wersja ciebie są w, ale dla Loopback 3

możesz to zrobić ..

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