Eloquent - 检测多列重复数据
Eloquent - Detect multiple column duplicate data
我有一个 table,它有 3 列 id, sub_id, name
。这是一个相当大的 table 并且有一些重复。
检测重复项以便删除它们的最佳方法是什么?
我试过了,但它 returns 一切(我想 id 使它们不唯一)
$collection = \App\MyModel::all();
$colUnique = $collection->unique(['name', 'sub_id']);
$dupes = $collection->diff($colUnique);
我想获得具有相同 name
和 sub_id
的模型。
id sub_id name
1 2 John
2 2 John <- duplicate
3 2 Robin <- unique
您可以使用 Collection.groupBy
方法。
$collection = \App\MyModel::all();
$collection
// Group models by sub_id and name
->groupBy(function ($item) { return $item->sub_id.'_'.$item->name; })
// Filter to remove non-duplicates
->filter(function ($arr) { return $arr->count()>1; })
// Process duplicates groups
->each(function ($arr) {
$arr
// Sort by id (so first item will be original)
->sortBy('id')
// Remove first (original) item from dupes collection
->splice(1)
// Remove duplicated models from DB
->each(function ($model) {
$model->delete();
});
})
我最好的选择是 DB::Query。
第一步:按组取数据
$uniqueData = DB::table('TABLE_NAME')
->groupBy(['sub_id', 'name'])
->select('id')
->toArray();
第 2 步:删除重复记录。
$noOfDeletedRecords = DB::table('TABLE_NAME')
->whereNotIn($uniqueData)
->delete();
好处:
1.只有2个查询
2. 比收集更好的性能。
我有一个 table,它有 3 列 id, sub_id, name
。这是一个相当大的 table 并且有一些重复。
检测重复项以便删除它们的最佳方法是什么?
我试过了,但它 returns 一切(我想 id 使它们不唯一)
$collection = \App\MyModel::all();
$colUnique = $collection->unique(['name', 'sub_id']);
$dupes = $collection->diff($colUnique);
我想获得具有相同 name
和 sub_id
的模型。
id sub_id name
1 2 John
2 2 John <- duplicate
3 2 Robin <- unique
您可以使用 Collection.groupBy
方法。
$collection = \App\MyModel::all();
$collection
// Group models by sub_id and name
->groupBy(function ($item) { return $item->sub_id.'_'.$item->name; })
// Filter to remove non-duplicates
->filter(function ($arr) { return $arr->count()>1; })
// Process duplicates groups
->each(function ($arr) {
$arr
// Sort by id (so first item will be original)
->sortBy('id')
// Remove first (original) item from dupes collection
->splice(1)
// Remove duplicated models from DB
->each(function ($model) {
$model->delete();
});
})
我最好的选择是 DB::Query。
第一步:按组取数据
$uniqueData = DB::table('TABLE_NAME')
->groupBy(['sub_id', 'name'])
->select('id')
->toArray();
第 2 步:删除重复记录。
$noOfDeletedRecords = DB::table('TABLE_NAME')
->whereNotIn($uniqueData)
->delete();
好处: 1.只有2个查询 2. 比收集更好的性能。