Laravel 如果存在重复项,删除 X 记录的有效方法

Laravel efficient way to remove X records if there are duplicates

我正在尝试编写一个查询,以便能够根据名为 hash 的列查找重复记录并删除除 5 条最新记录之外的所有记录,我想我可以使用 limit限制记录数量的方法,但不确定不执行多个查询的最佳方法。

例如,如果我在 applications 的数据库 table 中有 30 个条目,其中 hash 列是 ABC,那么我想删除 25 条记录,只留下 5 条记录。

如果某个特定 hash 有 6 条记录,那么我只想删除 1 条记录,但我不确定如果记录少于 5 条我将如何实现。

我当前要获取这些我将循环并删除的记录的查询是:

/**
 * Get applications by hash
 */
protected function getDuplicateApplications($hash = '')
{
    return Application::where('hash', $hash)
                      ->orderBy('created_at', 'asc')
                      ->limit(5)
                      ->get();
}

我还需要什么?

protected function deleteDuplicateApplications($hash = '', $skip = 5)
{
    // First get total count
    $totalCount = Application::where('hash', $hash)->count();

    // Then skip certain amount and take rest and delete it.
    return Application::where('hash', $hash)
                        ->orderBy('created_at', 'desc')
                        ->skip($skip)
                        ->take($totalCount - $skip)
                        ->delete();
}