another_dream
@another_dream
Backend-разработчик, Laravel/ZF2/Yii2

Как лучше ассоциировать модель и файлы/изображения относящиеся к ней?

Загрузка файлов на сервер реализована через отдельный контроллер, при сохранении файла на диск создаётся соответствующая запись в таблице "files" с указанием основных параметров файла, включая указанный вручную заголовок.

При создании определённой модели, к примеру, товара, необходимо загрузить файл на сервер, записать в базу и каким-то образом ассоциировать этот файл с создаваемой моделью товара.
Как лучше это сделать?

Пока что вижу три варианта:
- при создании товара в базе создавать пустую запись с null`ёвыми данными, таким образом файл можно сразу привязать к ID модели. Файлы и модели связывать через связующую таблицу.
- ID файлов писать в аттрибут модели (json_encoded или просто через запятую) и при выборке делать дополнительный запрос на получение файлов по ID.
- загружать файлы, в ответе получать ID записей с данными о файлах, инициировать сохранение модели товара, получать ID, с которым будет сохранён товар и в связующей таблице между files и goods обновлять model_id на соответствующий ID, с которым модель будет сохранена.

Спасибо.
  • Вопрос задан
  • 148 просмотров
Решения вопроса 1
Screamie
@Screamie
Full-stack разработчик
На мой взгляд лучше всего подойдет связующая таблица. И не нужно создавать запись с null при сохранении модели, на тот случай если у модели не будет прикрепленного файла, что бы не плодить пустые записи в БД.

Структура БД может быть такой

resource
-----------
id:PK
name
description

resource_file
---------------
resource_id:PK
file_id:PK

file
---------------
id:PK
path
description

И создать индексы для всех таблиц и внешние ключи для resource_file.resource_id и resource_file.file_id.

Таким образом вы сможете, например, сохранять несколько файлов для одной модели. А если правильно настроить связи с каскадным удалением, то можно переложить эту логику на БД, что бы не чистить базу вручную после удаления записи модели.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы