所以我试图获取具有较高 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();
使用
whereIn
闭包获取组中的最大id,并通过一个查询将其删除:
MasterPayrollInput::whereIn('id', function($query) {
$query->from('master_payroll_inputs')
->groupBy('nip')
->havingRaw('count(*) > 1')
->selectRaw('MAX(id)');
})->delete();
您可以使用原始查询来实现相同的目的:
假设您要删除
master_payroll_input
表中重复名称的记录:
如果您想保留
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');
如果您想保留
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');
使用以下查询删除重复项
$duplicateIds = MasterPayrollInput::where('periode', $month)
->orderBy('id', 'asc')
->offset(1)
->limit(10)
->pluck('id');
MasterPayrollInput::whereIn('id', $duplicateIds)->delete();
offset - 跳过您想要保留的第一行。
限制 - 可能没有。重复项。