You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,
]);

原代码问题说明

  1. Product::all()会加载所有产品到内存,数据量大时性能极差;
  2. 集合的unique()是内存层面去重,之后无法使用数据库分页(paginate()只能用于查询构建器);
  3. 代码中存在变量名错误($product = $product->orderBy...中的$product未正确定义)。

内容的提问来源于stack exchange,提问作者Mhammed Talhaouy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 09:01:35