在 Laravel Eloquent 中获取最新的重复数据

问题描述 投票:0回答:3

所以我试图获取具有较高 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();
php sql laravel eloquent
3个回答
3
投票

使用

whereIn
闭包获取组中的最大id,并通过一个查询将其删除:

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

0
投票

您可以使用原始查询来实现相同的目的:

假设您要删除

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


0
投票

使用以下查询删除重复项

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

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

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

限制 - 可能没有。重复项。

© www.soinside.com 2019 - 2024. All rights reserved.