Я пытаюсь написать запрос, чтобы найти повторяющиеся записи на основе столбца с именем hash
и удалить все, кроме 5 новейших записей, я подумал, что могу использовать метод limit
, чтобы ограничить количество записей, но не уверен, что лучший способ сделать это без выполнения нескольких запросов.
Например, если у меня есть 30 записей в моей таблице базы данных applications
, где столбец hash
равен азбука, я хочу удалить 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();
}
@RyanH Я обновил ответ. skip
следует использовать вместе с методом take()
Нужна ли мне конкретная версия Laravel для
skip
? Я использую 8.83, и при пропуске я получаю синтаксическую ошибку или нарушение прав доступа: 1064 У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL