如何在 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}`);