【问题标题】:Get the latest data on duplicate in Laravel Eloquent在 Laravel Eloquent 中获取最新的重复数据
【发布时间】:2020-03-17 05:17:38
【问题描述】:

所以我正在尝试获取具有更高 ID 号的重复数据,以便我可以删除最新的重复数据(而不是旧的)。

我尝试过使用 orderBy,但它不起作用

$duplicates = MasterPayrollInput::where('periode', $month)
        ->orderBy('id', 'asc')
        ->groupBy('nip')
        ->havingRaw('count(*) > 1')
        ->get();

    $duplicatesid = array_column($duplicates->toArray(), 'id');

    $todelete = array_map(function($item){ return $item[0]; }, $duplicatesid);

    MasterPayrollInput::whereIn('id', $duplicatesid )->delete();

【问题讨论】:

  • 使用MAX获取最新的id。你应该像SELECT max(col) FROM tablename GROUP BY colname HAVING count(col) > 1这样写你的查询

标签: sql laravel eloquent


【解决方案1】:

使用whereIn闭包获取组内最大id,一次查询删除:

MasterPayrollInput::whereIn('id', function($query) {
    $query->from('master_payroll_inputs')
          ->groupBy('nip')
          ->havingRaw('count(*) > 1')
          ->selectRaw('MAX(id)');
})->delete();

【讨论】:

    【解决方案2】:

    您可以使用相同的原始查询:

    假设您要删除master_payroll_input 表中名称重复的记录:

    1. 如果要保留id 值最低的行:

      $result = DB::delete('DELETE n1 FROM master_payroll_input n1, master_payroll_input n2 WHERE n1.id > n2.id AND n1.name = n2.name');

    2. 如果要保留id 值最高的行:

      $result = DB::delete('DELETE n1 FROM master_payroll_input n1, master_payroll_input n2 WHERE n1.id < n2.id AND n1.name = n2.name');

    【讨论】:

      【解决方案3】:

      使用以下查询删除重复项

      $duplicateIds = MasterPayrollInput::where('periode', $month)
          ->orderBy('id', 'asc')
          ->offset(1)
          ->limit(10)
          ->pluck('id');
      
      MasterPayrollInput::whereIn('id', $duplicateIds)->delete();
      

      offset - 跳过要保留的第一行。

      limit - 可能没有。重复。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-12-07
        • 2017-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-13
        • 2021-04-12
        相关资源
        最近更新 更多