下面的代码是我获得所有重复产品(按标题(并将它们分组的代码。它非常好用。然而,我的产品表中有太多记录,而获取所有记录会导致性能问题。是否有一种方法可以对此进行优化,以避免获取所有记录并将其分组到一个查询中?非常感谢。
$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();
结果将是具有title
和count
属性的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);