@PRodion

Проблема в выборе отношения или не правильная структура базы данных?

В течение недели из-за дня в день переписываю все заново. Застрял на одном месте из-за того, что не получается правильно спроектировать базу данных. Получается так, что вроде все правильно, но когда дело доходит до завершения — упираюсь в неправильную структуру.

Есть 3 таблицы:

Производитель.
— Имеет id и name.

Коллекция.
— Имеет id, manufacturer_id и name.

Цвет.
— Имеет id, collection_id и name.

Логика:

У одного производителя может быть много коллекций. Одна коллекция может принадлежать одному производителю. У коллекции может быть много цветов. Один цвет может принадлежать только одной коллекции.

Сразу скажу, что цвет — это не цвет в привычном понимании, а именно физическая вещь. Если бы это был цвет в привычном понимании, то логично, что один цвет может принадлежать разным коллекциям, но это не тот случай. В нашем случае цвет — это то, что мы используем в качестве имени для безымянного предмета. Коллекции — это не коллекция в понимании Laravel, а просто название таблицы и модели.

— 1. Производитель.
— — 1. Коллекция.
— — — 1. Цвет.
— — 2. Коллекции.
— — — 2. Цвет.
— 2. Производитель.
— — 3. Коллекция.
— — — 3. Цвет.
— — 4. Коллекция.
— — — 4. Цвет.

Мне показалось логичным использование связи hasMany() (один-ко-многим), но все оказалось немного сложнее.

Страницы:

Нам не известны цвета и коллекции. Мы видим только их общее количество.

(Страница производителя)
Производитель — Коллекции — Цвета
Имя_____________2(две)______2(два)

(Страница коллекции)
Производитель — Коллекции — Цвета
Имя_____________Имя_________1(один)
Имя_____________Имя_________1(один)

Когда мы открыли страницу цветов.

(Страница цвета)
Производитель — Коллекции — Цвета
Имя_____________Имя_________Имя
Имя_____________Имя_________Имя

На странице производителя все очень просто и понятно. Мы можем связать модель производителя с моделью коллекции через hasMany() и с моделью цветов через hasManyThrough(). Потом можем посчитать общие количество коллекций и цветов этого производителя с помощью withCount().

На странице коллекции тоже все очень просто. У нас есть обратная связь с моделью производителя belongsTo() и связь с моделью цветов через hasMany(). Мы используем withCount() для подсчёта общего количества цветов принадлежащих этой коллекции.

На странице цветов — тупик. Мы можем получить коллекции к которой принадлежит цвета т.к у нас есть обратная связь с коллекциями через belongsTo(), но у нас нет обратной связи с моделью производителей. В Laravel нет обратной связи для hasManyThrough().

Получается, что либо у меня заведомо не правильно виденье решения этой задачи, либо проблема со структурой базы данных. Это мой первый опыт разработки, поэтому я хотел бы поступить правильно, а не сделать лишь бы как. Как вы решили бы эту задачу? Желательно максимально правильное решение дабы не учить новичка плохому. Однако я буду рад любым идея и предложения.
  • Вопрос задан
  • 155 просмотров
Решения вопроса 1
Kulaxyz
@Kulaxyz
Могу лучше
Если я вас правильно понял, у цвета только одна коллекция, а у коллекций всего один производитель. Тогда в модели можно просто сделать метод
return $this->collection()->first()->manufacturer();
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@vism
Так замечательно задан вопрос, что аж ответить захотелось!

Структура у вас правильная, нсколько я понял из описания.

И поторой такие "цепочки связей" бывают не из 3-х звеньев, а из 10-ти:)
Просто у лараваель есть hasManyThrough через 1 таблицу, но это ни к чему не обязывает. Недавно видел пакет hasManyThrough для 2+ промежуточных таблиц.
Для получения обратных связей по belongTo просто используете так, никакого обратного hasManyThrough тут и ненадо:
$color->collection;
$color->collection->manufacturer;
Ответ написан
@immelnikoff
Изучаю БД
Самое главное в проектировании БД – это досконально разобраться в предметной области.
Один цвет может принадлежать только одной коллекции.

Странное условие. Неужели две разные коллекции не могут быть синими?

В нашем случае цвет — это то, что мы используем в качестве имени для безымянного предмета

То есть у предмета может быть несколько имен?

Почему бы не сделать отдельно таблицу Коллекция и отдельно таблицу Цвет и связать их таблицей M:N?
Ответ написан
Ваш ответ на вопрос

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

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