Laravel 雄辩-检测多列重复数据
我有一个表,它有3个列id,sub_id,name。那是一张相当大的桌子,还有一些复制品 检测重复项以便删除它们的最佳方法是什么 我试过了,但它返回了所有我认为ID使它们非唯一的东西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的模型 你
$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();