如何在 strapi 中动态过滤
How to filter dynamically in strapi
这可能是最新手的 Strapi 或后端问题,但我才刚刚开始做后端,所以请多多包涵。
话虽如此,我有以下情况。我正在建立一个网上商店,我拥有的每件产品都有价格(必填字段)和 new_price(可选)。当我按 min-max 值过滤我的 API 时,如果 new_price 不可用,我想过滤价格;如果可用,我想过滤 new_price。这在 strapi 中完全可行吗?
{
id: 2,
attributes: {
name: "My name",
createdAt: "2022-01-15T11:28:46.138Z",
updatedAt: "2022-02-16T10:38:20.412Z",
publishedAt: "2022-01-15T11:29:30.306Z",
description: "Lorem ipsum",
item_code: "688002",
slug: "some-slug-here",
available: true,
price: 59,
new_price: 21.9
}
http://localhost:1337/api/products?filters[price || new_price][$gte]=50
所以我想到了这个解决方案。它可能很难看,而不是它是如何完成的,但它确实有效,而且我想不出其他任何东西。如果有人有更好的解决方案,我将不胜感激!
const query = qs.stringify(
{
populate: '*',
pagination: {
page: page,
pageSize: PER_PAGE
},
filters: {
$or: [
{
$and: [
[
{
new_price: {
$null: true
}
},
{
price: {
$gte: minPrice
}
},
{
price: {
$lte: maxPrice
}
}
]
]
},
{
$and: [
[
{
new_price: {
$notNull: true
}
},
{
new_price: {
$gte: minPrice
}
},
{
new_price: {
$lte: maxPrice
}
}
]
]
}
]
}
},
你的回答很好。刚刚在这里发布了我的完整实现,以便它可以帮助偶然发现它的其他人。
const qs = require("qs");
const query = qs.stringify(
{
filters: {
$or: [
{
$and: [
{ new_price: { $notNull: true } },
{ new_price: { $gte: minPrice } },
{ new_price: { $lte: maxPrice } },
],
},
{
$and: [
{ new_price: { $null: true } },
{ price: { $gte: minPrice } },
{ price: { $lte: maxPrice } },
],
},
],
},
},
{
encodeValuesOnly: true,
}
);
await request(`/api/books?${query}`);
这可能是最新手的 Strapi 或后端问题,但我才刚刚开始做后端,所以请多多包涵。
话虽如此,我有以下情况。我正在建立一个网上商店,我拥有的每件产品都有价格(必填字段)和 new_price(可选)。当我按 min-max 值过滤我的 API 时,如果 new_price 不可用,我想过滤价格;如果可用,我想过滤 new_price。这在 strapi 中完全可行吗?
{
id: 2,
attributes: {
name: "My name",
createdAt: "2022-01-15T11:28:46.138Z",
updatedAt: "2022-02-16T10:38:20.412Z",
publishedAt: "2022-01-15T11:29:30.306Z",
description: "Lorem ipsum",
item_code: "688002",
slug: "some-slug-here",
available: true,
price: 59,
new_price: 21.9
}
http://localhost:1337/api/products?filters[price || new_price][$gte]=50
所以我想到了这个解决方案。它可能很难看,而不是它是如何完成的,但它确实有效,而且我想不出其他任何东西。如果有人有更好的解决方案,我将不胜感激!
const query = qs.stringify(
{
populate: '*',
pagination: {
page: page,
pageSize: PER_PAGE
},
filters: {
$or: [
{
$and: [
[
{
new_price: {
$null: true
}
},
{
price: {
$gte: minPrice
}
},
{
price: {
$lte: maxPrice
}
}
]
]
},
{
$and: [
[
{
new_price: {
$notNull: true
}
},
{
new_price: {
$gte: minPrice
}
},
{
new_price: {
$lte: maxPrice
}
}
]
]
}
]
}
},
你的回答很好。刚刚在这里发布了我的完整实现,以便它可以帮助偶然发现它的其他人。
const qs = require("qs");
const query = qs.stringify(
{
filters: {
$or: [
{
$and: [
{ new_price: { $notNull: true } },
{ new_price: { $gte: minPrice } },
{ new_price: { $lte: maxPrice } },
],
},
{
$and: [
{ new_price: { $null: true } },
{ price: { $gte: minPrice } },
{ price: { $lte: maxPrice } },
],
},
],
},
},
{
encodeValuesOnly: true,
}
);
await request(`/api/books?${query}`);