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

时间:2019-04-16 20:08:18

标签: 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);

我想获得具有namesub_id相同的模型。

id    sub_id   name
1       2      John
2       2      John   <- duplicate
3       2      Robin  <- unique

2 个答案:

答案 0 :(得分:3)

您可以使用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();
      });
  })

答案 1 :(得分:2)

我最好的选择是DB :: Query。

步骤1:按组提取数据

$uniqueData = DB::table('TABLE_NAME')
                  ->groupBy(['sub_id', 'name'])
                  ->select('id')
                  ->toArray();

第2步:删除重复的记录。

$noOfDeletedRecords = DB::table('TABLE_NAME')
                          ->whereNotIn($uniqueData)
                          ->delete();

好处: 1.仅2个查询 2.优于收款。