Laravel 雄辩-检测多列重复数据

Laravel 雄辩-检测多列重复数据,laravel,eloquent,query-builder,laravel-collection,Laravel,Eloquent,Query Builder,Laravel Collection,我有一个表,它有3个列id,sub_id,name。那是一张相当大的桌子,还有一些复制品 检测重复项以便删除它们的最佳方法是什么 我试过了,但它返回了所有我认为ID使它们非唯一的东西 $collection = \App\MyModel::all(); $colUnique = $collection->unique(['name', 'sub_id']); $dupes = $collection->diff($colUnique); 我想得到具有相同名称和sub_id的模型 你

我有一个表,它有3个列id,sub_id,name。那是一张相当大的桌子,还有一些复制品

检测重复项以便删除它们的最佳方法是什么

我试过了,但它返回了所有我认为ID使它们非唯一的东西

$collection = \App\MyModel::all();
$colUnique = $collection->unique(['name', 'sub_id']);
$dupes = $collection->diff($colUnique);
我想得到具有相同名称和sub_id的模型

你可以利用这个方法

$collection=\App\MyModel::all; $collection //按子单元id和名称对模型进行分组 ->groupByfunction$item{return$item->sub_id.''.'.$item->name;} //筛选以删除非重复项 ->filterfunction$arr{return$arr->count>1;} //处理重复组 ->每个函数$arr{ $arr //按id排序,以便第一项为原始项 ->卑鄙的 //从重复项集合中删除第一个原始项 ->拼接1 //从数据库中删除重复的模型 ->每个函数$model{ $model->delete; }; }
我最好的选择是DB::Query

步骤1:按分组获取数据

第二步:删除重复记录

好处: 1.只有2个查询
2.性能优于收集。

为什么不使用toArray函数,通过运行php函数array\u unique和array\u diff来获取所有重复项,然后运行foreach循环并删除它们。或者,如果您想使用SQL方式,在检索模型时使用groupBy函数。虽然此方法更有效,若模型已删除观察者/处理程序,则可能会引发问题。此外,您还应该选择MINid。需要进行一些轻微的更改,但是+1可以获得更好的性能。性能是关键。@Styx是的,我同意你的看法。对于观察者/处理者,这种方法是有问题的。有一个变通方法,而不是直接使用DB模型。i、 e.`MyModel::whereNotIn$ARRAY->delete。问题解决了D@RutvijKothari我只是指Styx的回复。我喜欢你的方式。。不用担心。从性能角度来看,调用\App\MyModel::all;把所有的模型都存储在内存中真的是件坏事…@AnixPasBesoin,这要看情况而定。
id    sub_id   name
1       2      John
2       2      John   <- duplicate
3       2      Robin  <- unique
$uniqueData = DB::table('TABLE_NAME')
                  ->groupBy(['sub_id', 'name'])
                  ->select('id')
                  ->toArray();
$noOfDeletedRecords = DB::table('TABLE_NAME')
                          ->whereNotIn($uniqueData)
                          ->delete();