
本文介绍如何在 Laravel ORM 中基于多个列的值来删除重复记录。通过使用 SQL 的窗口函数 `ROW_NUMBER()`,可以为具有相同 `username` 和 `discipline` 列值的记录分配一个序号,然后选择序号为 1 的记录,从而实现去重的目的。同时,本文还提供了 Laravel 中的具体实现代码,方便读者参考。
在处理需要记录历史版本的数据时,可能会出现基于某些字段的重复数据。例如,用户可以重复提交比赛结果,系统需要保存历史结果以供回溯,但同时需要保证在特定时间段内,基于某些关键字段的结果是唯一的。 Laravel 的 ORM 提供的 distinct() 方法在处理多列去重时可能无法满足需求。本文将介绍一种使用原生 SQL 查询配合窗口函数 ROW_NUMBER() 来实现多列去重的方案。
核心思路是使用 ROW_NUMBER() 函数为每个分组(基于需要去重的列)内的记录分配一个序号,然后只选择序号为 1 的记录。 以下是一个 SQL 示例,用于从 results 表中删除基于 username 和 discipline_one 到 discipline_six 列的重复记录,并保留 id 值最大的记录:
WITH cte AS (
    SELECT *, ROW_NUMBER() OVER
    (PARTITION BY username, discipline_one, discipline_two, discipline_three,
     discipline_four, discipline_five, discipline_six ORDER BY id DESC) rn
    FROM results
)
SELECT id, username, discipline_one, discipline_two, discipline_three,
     discipline_four, discipline_five, discipline_six, created_at, updated_at
FROM cte
WHERE rn = 1这段 SQL 代码的逻辑如下:
在 Laravel 中,可以使用 DB::select() 方法执行原生 SQL 查询。 以下是一个示例,展示如何在 Laravel 中实现上述 SQL 查询:
public static function waybackWhen($result)
{
    $username = $result->username;
    config()->set('database.connections.mysql.strict', false);
    DB::reconnect(); // Important as the existing connection if any would be in strict mode.
    $resultSet = DB::select("
        WITH cte AS (
            SELECT *, ROW_NUMBER() OVER
            (PARTITION BY username, discipline_one, discipline_two, discipline_three,
             discipline_four, discipline_five, discipline_six ORDER BY id DESC) rn
            FROM results
        )
        SELECT id, username, discipline_one, discipline_two, discipline_three,
             discipline_four, discipline_five, discipline_six, created_at, updated_at
        FROM cte
        WHERE rn = 1 AND username = ?
   ", [ $username ]);
    // Now changing back the strict ON.
    config()->set('database.connections.mysql.strict', true);
    DB::reconnect();
    return $resultSet;
}这段代码的逻辑如下:
注意事项:
本文介绍了一种使用 SQL 窗口函数 ROW_NUMBER() 在 Laravel 中实现多列去重的方案。 通过使用原生 SQL 查询,可以灵活地处理复杂的去重需求。 在实际应用中,可以根据具体情况调整 SQL 查询和 Laravel 代码。 使用此方法能够有效地清理重复数据,并保证数据的唯一性和准确性。
以上就是在 Laravel ORM 中基于多列删除重复项的详细内容,更多请关注php中文网其它相关文章!
 
                        
                        每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
 
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号