Mysql 单个查询可从获得的结果中获取分页数据和所有可能的筛选器

Mysql 单个查询可从获得的结果中获取分页数据和所有可能的筛选器,mysql,laravel,eloquent,e-commerce,eloquent-relationship,Mysql,Laravel,Eloquent,E Commerce,Eloquent Relationship,我正在写一个查询来执行电子商务搜索。我需要满足3个搜索条件 按类别id搜索 按关键字搜索 按产品类型搜索(特色、热门、新) 此外,我需要提取所有可能的过滤器,以显示用户从过滤结果(非分页结果) 我有以下关系 products products -> images, products -> translation, products -> categories, products -> variants, products -> brand products ->

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

  • 按类别id搜索
  • 按关键字搜索
  • 按产品类型搜索(特色、热门、新)
  • 此外,我需要提取所有可能的过滤器,以显示用户从过滤结果(非分页结果)

    我有以下关系

    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   
    
    其思想是,当用户搜索一个类别时,过滤器会显示在属于该类别的侧栏中。当用户选择一些过滤器并应用搜索时,将通过分页获得新的过滤结果。我仍然从新结果中提取可能的过滤器


    我需要建议在这种情况下该怎么办。请提供帮助。

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


    稍后,您可以将可能的筛选器从单个查询(可能有来自关系表的联接)拆分为多个查询。这可能会增加DB调用,但会在性能方面带来好处。

    很抱歉问这个问题,但为什么需要使用LengthAwarePaginator?你不可以只使用Products::paginate(15)吗?如果你使用的是Laravel Eloquentif如果我直接对结果进行分页,我将如何从搜索标准中获取过滤器在调用paginate之前,你可以对where部分使用if语句,另外,你只需要使用leftJoin或join in in laravel Elotent来获取筛选表,很抱歉问这个问题,因为我真的不明白你是如何编写你的code@Kelvin在我的if条件下应该是什么?检查请求是否为空或与if(request()->has('max_price')){$query->where()不同