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);

我想获得具有相同 namesub_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. 比收集更好的性能。