Задать вопрос
@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().

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