单个查询以获取分页数据以及从获得的结果中获取所有可能的过滤器

Single Query to get paginated data and all possible filters from the obtained results

我正在编写查询以执行电子商务搜索。我需要满足 3 个搜索条件。

  1. 按类别 ID 搜索
  2. 按关键字搜索
  3. 按产品类型搜索(精选、热门、新品)

我还需要提取所有可能的过滤器以从过滤结果(不是分页结果)中向用户显示。

我有以下关系。

products
products -> images,
products -> translation,
products -> categories,
products -> variants,
products -> brand
products -> category
products -> addons
products -> product_attributes

我所做的是首先根据搜索条件获取所有产品。从获得的结果中提取所有可能的过滤器。然后使用 LengthAwarePaginator.

对结果进行分页

这种方法适用于少量产品。但现在我有超过 4k 的产品。当我的查询被执行时,内存由于太多的关系而耗尽。我减少了产品和所有关系中的列数。处理时间也增加了 6 秒,这是我无法承受的。

这些是我需要从获得的集合中提取的过滤器

attributes
brands
categories
min_price
max_price   

这个想法是,当用户搜索一个类别时,过滤器会显示在属于该类别的侧边栏中。当用户选择一些过滤器并应用搜索时,将通过分页获得新的过滤结果。我仍然从新结果中提取可能的过滤器。

我需要关于在这种情况下该怎么做的建议。请帮忙。

我建议对您的产品进行单独的分页查询和单独的查询以根据用户选择获取可能的过滤器,直接从数据库获取此信息而不是 cook/filter 来自 laravel 的数据] 辅助方法或代码。在数据库方面,如果关系形成正确且索引正确,则有几种方法可以优化查询性能。如果您从代码中执行此提取,它肯定会增加服务器的内存使用量。

稍后您可以将可能的过滤器单个查询(可能有来自关系 table 的连接)分解为多个查询,这可能会增加数据库调用,但会在性能方面提供好处。