Как получить путь к файлу, если известен только его 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 и вы имеете свой путь.
В общем, только сейчас додумался. Вот так работает:
// Контроллер
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();
}
Если кто-то предложит более рациональный код (например, упростить и сократить) — буду очень признателен :)