Mysql 单个查询可从获得的结果中获取分页数据和所有可能的筛选器
我正在写一个查询来执行电子商务搜索。我需要满足3个搜索条件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 ->
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()不同