Laravel中按product_part_number去重并实现分页的问题求助
解决Laravel产品按product_part_number去重后分页的问题
你的问题核心是集合去重后无法使用数据库分页,原代码先拉取所有产品到内存再去重的方式不仅性能差,还没法利用Laravel的paginate()(它依赖数据库层面的分页逻辑)。下面是两种高效的数据库层面去重+分页的实现方案:
方案一:基于ID分组取最新记录(推荐,性能最优)
利用子查询获取每个product_part_number对应的最新产品ID,再通过这些ID查询并分页:
// 子查询:按product_part_number分组,取每组最新的产品ID(假设ID自增,最新ID对应最新创建的产品) $latestProductIds = Product::select(DB::raw('MAX(id) as id')) // 这里加上你的分类/子分类筛选条件,比如: // ->where('category_id', $selectedCategoryId) // ->where('subcategory_id', $selectedSubcategoryId) ->groupBy('product_part_number'); // 主查询:根据子查询的ID筛选,排序后分页 $products = Product::whereIn('id', $latestProductIds) ->orderBy('created_at', 'desc') ->paginate(10); return view('livewire.multi-report', [ 'products' => $products, ]);
方案二:基于创建时间分组取最新记录
如果ID不是自增或与created_at顺序不一致,可以用创建时间的最大值关联查询:
// 子查询:按product_part_number分组,记录每组的最新创建时间 $latestProductTimestamps = Product::select(DB::raw('product_part_number, MAX(created_at) as max_created_at')) // 同样加上分类/子分类筛选条件 // ->where('category_id', $selectedCategoryId) ->groupBy('product_part_number'); // 主查询:关联子查询,匹配product_part_number和最新创建时间 $products = Product::joinSub($latestProductTimestamps, 'latest_products', function ($join) { $join->on('products.product_part_number', '=', 'latest_products.product_part_number') ->on('products.created_at', '=', 'latest_products.max_created_at'); }) ->orderBy('products.created_at', 'desc') ->paginate(10); return view('livewire.multi-report', [ 'products' => $products, ]);
原代码问题说明
Product::all()会加载所有产品到内存,数据量大时性能极差;- 集合的
unique()是内存层面去重,之后无法使用数据库分页(paginate()只能用于查询构建器); - 代码中存在变量名错误(
$product = $product->orderBy...中的$product未正确定义)。
内容的提问来源于stack exchange,提问作者Mhammed Talhaouy
相关产品推荐
相关产品推荐

