Если вам нужен пошаговый план действий, то примерно так:
1. получить все id из таблицы save в виде массива
2. получить все названия файлов в папке сохранений в виде массива
3. в цикле foreach пройтись по массиву id, искать в массиве названий файлов совпадения.
если совпадения нет, вызывать метод удаления записи из таблицы по id
4. в цикле foreach пройтись по массиву названий файлов, искать в массиве id совпадения.
если опять же совы не падают, вызывать метод удаления файла
в псевдокоде это будет примерно так:
class TableDirectoryCleaner
{
private array $ids = [];
private array $filenames = [];
public function doTheBeauty()
{
$this->init();
$this->checkTableAndDeleteRowsWithoutFiles();
$this->checkFolderAndDeleteFilesWithousRow();
}
private function init()
{
$this->fillIds();
$this->fillFilenames();
}
private function fillIds()
{
$this->ids = $this->getRepository(Save::class)->findAllIdsAsArray();
}
private function fillFilenames()
{
$this->filenames = $this->someMethodThatGetsFilenamesAsArray();
}
private function checkTableAndDeleteRowsWithoutFiles()
{
foreach ($this->ids as $id) {
if (!array_search($id, $this->filenames)) {
$this->getRepository(Save::class)->deleteRowWithId($id);
}
}
}
private function checkFolderAndDeleteFilesWithousRow()
{
foreach ($this->filenames as $filename) {
if (!array_search($filename, $this->ids)) {
unlink($filename);
}
}
}
}
PS как, собственно, вам и написал
nokimaro