- workaround to provide a functionality equivalent to nested queries
- remove all or only some of the entries that do not respect the criteria
This mixin is a workaround to an issue with loopback that does not allow to queries to filter based on nested properties. This is not a patch the connectors.
npm install loopback-nested-filter-mixin --save
Add the mixin property to your server/model-config.json like the following:
{
"_meta": {
"sources": [
"loopback/common/models",
"loopback/server/models",
"../common/models",
"./models"
],
"mixins": [
"loopback/common/mixins",
"loopback/server/mixins",
"../common/mixins",
"./mixins",
"../node_modules/loopback-nested-filter-mixin"
],
}
}
Add the mixin attribute to the definition of all Models you want to use it with.
{
"name": "app",
"properties": {
"name": {
"type": "string",
}
},
"relations": {
"users": {
"type": "hasMany",
"model": "user",
"foreignKey": "appId",
"through": "userRole"
}
},
"mixins": {
"NestedFilter": null
}
}
When filtering on nested objects, the user should specify his conditions in the include filter, according to the following example (using the Appointment example from docs). In this case, we want to get the information of any patient that has an appointment with any Doctor named Strange.
GET /patients?filter={"include":[{
"relation": "appointment",
"scope": {
"include": [{
"relation": "physician",
"scope": {
"where": {"name": "Strange"}
}
}]
}
}],
"excludeIfEmpty": true
}
The mixin is configured to support two different filtering behaviours:
- Remove any entry it finds where the includes generated an empty list.
(Loopback's default behaviour would be to return every patient.appointment either with Strange's info or an empty list)
{
"where": "...",
"include": "...",
"excludeIfEmpty": true
}
- Remove any entry it finds where the includes generated an empty list and the user set it as an exclusion criteria.
{
"where": "...",
"include": [{
"relation": "appointment",
"scope": {
"include": [{
"relation": "physician",
"scope": {
"where": {"name": "Strange"},
"include": [{
"relation": "university",
"scope": {
"where": {"name": "Harvard"}
}
}]
}
}]
}
}],
},
"excludeIfEmpty": ["appointment.physician"]
}
In this case, we want to get the info of every Patient that has an Appointment with a Doctor named Strange and, in case he went to Harvard, we want to retrieve that information. But we don't want it to be an exclusion criteria.