Я хочу отфильтровать REST API по вложенным данным. Например этот объект:
[
{
"name": "Handmade Soft Fish",
"tags": "Rubber, Rubber, Salad",
"categories": [
{
"name": "women",
"id": 2,
"parent_id": 0,
"permalink": "/women"
},
{
"name": "kids",
"id": 3,
"parent_id": 0,
"permalink": "/kids"
}
]
},
{
"name": "Tasty Rubber Soap",
"tags": "Granite, Granite, Chair",
"categories": [
{
"name": "kids",
"id": 3,
"parent_id": 0,
"permalink": "/kids"
}
]
}
]
собирается GET /api/products?filter[include]=categories
и я хотел бы получать только те товары, которые имеют название категории "женщины". Как это сделать?





Не могли бы вы рассказать, как это выглядит без фильтра [include] = category, пожалуйста?
[редактировать]
после нескольких вопросов в комментариях я бы создал удаленный метод: в common/models/myModel.js (внутри функции):
function getItems(filter, categorieIds = []) {
return new Promise((resolve, reject) => {
let newInclude;
if (filter.hasOwnProperty(include)){
if (Array.isArray(filter.include)) {
newInclude = [].concat(filter.include, "categories")
}else{
if (filter.include.length > 0) {
newInclude = [].concat(filter.include, "categories");
}else{
newInclude = "categories";
}
}
}else{
newInclude = "categories";
}
myModel.find(Object.assign({}, filter, {include: newInclude}))
.then(data => {
if (data.length <= 0) return resolve(data);
if (categoriesIds.length <= 0) return resolve(data);
// there goes your specific filter on categories
const tmp = data.filter(
item => item.categories.findIndex(
categorie => categorieIds.indexOf(categorie.id) > -1
) > -1
);
return resolve(tmp);
})
}
}
myModel.remoteMethod('getItems', {
accepts: [{
arg: "filter",
type: "object",
required: true
}, {
arg: "categorieIds",
type: "array",
required: true
}],
returns: {arg: 'getItems', type: 'array'}
});
Надеюсь, он ответит на ваш вопрос ...
Зачем тебе это нужно? это только для чтения или вам нужно создать такой фильтр для создания / обновления / удаления? (Извините за мой английский...)
а как насчет filter [fields] [name] = true & filter [fields] [tags] = true & filter [f ields] [categoryId] = true? (замените categoryId на имя свойства отношения)
Мне нужна эта информация на странице категории, чтобы показывать товары только из данной категории. Однако «категории» - это просто пример, потому что в каждом объекте у меня есть больше свойств, которые также имеют вложенные данные, и мне, вероятно, понадобится в других случаях.
он будет работать для категории, и что с аналогичными случаями, когда ключ другой, другой вложенность или работа с другой моделью. Должно быть что-то универсальное, но спасибо за помощь
Да должно быть ... Может с Loopback 4? пожалуйста
А также, что я иногда делаю для чтения данных из mariadb или MySQL, я создаю представление с некоторыми соединениями и применяю это представление к модели обратной связи, чтобы я мог фильтровать то, что хочу. Но я не знаю, какую базу данных вы используете, и не уверен, что вы сможете применить эту технику для той цели, которую хотите достичь. Это просто еще один совет ...
LoopBack не поддерживает фильтры на основе связанных моделей.
Это ограничение, которое, к сожалению, нам никогда не приходилось решать :(
Для получения дополнительных сведений см. Обсуждение и связанные вопросы здесь:
Возможно, вы хотите получить эти данные с помощью Category REST API. Например:
GET /api/categories?filter[include]=products&filter[where][name]=woman
Результатом будет объект category со всеми связанными с ним products. Для этого необходимо будет заявить это отношение на своих моделях.
это хорошая идея, но у каждого объекта продукта есть и другие связи, например варианты, параметры, изображения и т. д. Тогда я не могу расширить свойства продукта
Try like this.It has worked for me.
const filter = {
where: {
'categories.name': {
inq: ['women']**strong text**
}
}
};
Pass this filter to request as path parameters and the request would be like bellow
GET /api/categoriesfilter=%7B%22where%22:%7B%categories.name%22:%7B%22inq%22:%5B%women%22%5D%7D%7D%7D
[{ "name": "Handmade Soft Fish", "tags": "Rubber, Rubber, Salad" }, { "name": "Tasty Rubber Soap", "tags": "Granite, Granite, Chair" }]выглядит так