Laravel:如何获得重复的记录并将它们组合在一起



下面的代码是我获得所有重复产品(按标题(并将它们分组的代码。它非常好用。然而,我的产品表中有太多记录,而获取所有记录会导致性能问题。是否有一种方法可以对此进行优化,以避免获取所有记录并将其分组到一个查询中?非常感谢。

$products = Product::all();
$groupsOfProducts = $products->groupBy('title');
$duplicatedProductsGrouped = [];
foreach($groupsOfProducts as $productGroup) {
$productIsDuplicated = $productGroup->count() > 1; 
if($productIsDuplicated) {
$duplicatedProductsGrouped[] = $productGroup;
}
}
var_dump($duplicatedProductsGrouped);

您可以通过以下方式在组中使用having

Product::groupBy('title')->having(DB::raw('count(*)'), ">", "1")->select('title')->get()

你会得到重复的标题,然后你可以用这些标题查询数据库

编辑:也请尝试看看这是否是更快的

Product::getQuery()->whereIn('title', array_column( DB::select('select title from products group by title having count(*) > 1'), 'title'))->get();

通过这一行,您将只获得具有重复标题的产品,因此您的Collection groupby应该可以更快地通过title聚合记录

让您的数据库来完成工作。当你调用Product::all()时,你得到了每一条记录,然后让PHP完成剩下的工作

Product::selectRaw("title, COUNT(*) AS count")->groupBy("title")->get();

结果将是具有titlecount属性的Product实例的Collection,您可以访问并确定重复的实例:

$products = Product::selectRaw("title, COUNT(*) AS count")->groupBy("title")->get();
$duplicatedProducts = collect([]);
foreach($products AS $product){
if($product->count > 1){
$duplicatedProducts->push($product);
}
}
dd($duplicatedProducts);

最新更新