Как получить путь к файлу, если известен только его id?

товарищи!

Мне необходимо написать функцию удаления файла — физически и записи его в БД. Проблема в том, что я не могу получить его путь в контроллере, известно только id. А запись из БД удалить не проблема (в БД поля — id(integer), path(text) и dateAdded(text)). Файл должен удаляться по ссылке (в моём случае это — /test.org/admin/file/1, где «1» — его id). Вот Такой контроллер:

public function deleteFile(HTTPRequest $req): void
{
    // Это, конечно же, не работает
    // $path = $req->getData('path');
    // unlink($path);

    $this->fileManager->delete($req->getData('id'));
    $this->httpResponse->redirect('/admin/listFiles');
}

А это модель (для примера, к ней вопросов нет, она просто удалит строчку в БД и всё):

public function delete($id): void
{
    $sql = "DELETE FROM files WHERE id = :id";
    $req = $this->db->prepare($sql);
    $req->bindValue(':id', $id, \PDO::PARAM_INT);
    $req->execute();
}

Как бы получить путь к файлу? Буду рад любому толковому совету!


Ответы (2 шт):

Автор решения: Владимир

у вас же в структуре записи в бд почти по русски написано — id(integer), path(text) и dateAdded(text)) вот в поле path и лежит путь к вашему файлу :) SELECT path FROM files WHERE id = :id и вы имеете свой путь.

→ Ссылка
Автор решения: Linne

В общем, только сейчас додумался. Вот так работает:

// Контроллер
public function deleteFile(HTTPRequest $req): void
{
    $id = $req->getData('id');
    $file = $this->fileManager->path($id);
    $path = $file->getPath();
    unlink($path);
    $this->fileManager->delete($req->getData('id'));
    $this->httpResponse->redirect('/admin/listFiles');
}

// Модель
public function path($id) : ?File
{
    $sql = "SELECT path FROM files WHERE id = :id";
    $req = $this->db->prepare($sql);
    $req->bindValue(':id', $id, \PDO::PARAM_INT);
    $req->execute();
    $req->setFetchMode(\PDO::FETCH_CLASS, File::class);
    $file= $req->fetch();
    return $file ?: null;
}

public function delete($id): void
{
    $sql = "DELETE FROM files WHERE id = :id";
    $req = $this->db->prepare($sql);
    $req->bindValue(':id', $id, \PDO::PARAM_INT);
    $req->execute();
}

Если кто-то предложит более рациональный код (например, упростить и сократить) — буду очень признателен :)

→ Ссылка