Eloquent - обнаружение повторяющихся данных в нескольких столбцах - PullRequest
0 голосов
/ 16 апреля 2019

У меня есть таблица с 3 столбцами id, sub_id, name. Это довольно большой стол и есть несколько дубликатов.

Как лучше всего обнаружить дубликаты, чтобы я мог их удалить?

Я попробовал это, но он возвращает все (я думаю, думая, что идентификаторы делают их неуникальными)

$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

Ответы [ 2 ]

3 голосов
/ 16 апреля 2019

Моя лучшая ставка - 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. Повышение производительности по сравнению со сбором.

3 голосов
/ 16 апреля 2019

Вы можете использовать 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();
      });
  })
...