В течение недели из-за дня в день переписываю все заново. Застрял на одном месте из-за того, что не получается правильно спроектировать базу данных. Получается так, что вроде все правильно, но когда дело доходит до завершения — упираюсь в неправильную структуру.
Есть 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()
.
Получается, что либо у меня заведомо не правильно виденье решения этой задачи, либо проблема со структурой базы данных. Это мой первый опыт разработки, поэтому я хотел бы поступить правильно, а не сделать лишь бы как. Как вы решили бы эту задачу? Желательно максимально правильное решение дабы не учить новичка плохому. Однако я буду рад любым идея и предложения.