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();
}
我正在尝试编写一个查询,以便能够根据名为 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();
}