Laravel объединить 4 стола - PullRequest
0 голосов
/ 14 марта 2019

Я начал изучать структуру Laravel 5.8 и получил проблему.Проблема больше связана с проектированием базы данных.Но для Laravel необходимо решение (желательно Eloquent ORM).

Задача заключается в следующем: есть интернет-магазин цветов.На сайте есть категория "Букеты".Букеты имеют определенный размер (S, M, L ...).Размер состоит из количества цветов в букете, высоты букета, диаметра.Кроме того, каждый размер может иметь одно имя, но разное количество цветов, высоты и диаметра.

Например:

  • размер- "S": считать 21, высота 50 см, ширина40см.
  • размер- "S": считать 15, высота 50см, ширина 30см.

Каждый размер может принадлежать разным букетам (отношение многих ко многим).

Администратор может выбрать существующий размер для нового букета или создать новый размер.Он устанавливает имя, количество, высоту и диаметр.В этом случае один букет может иметь несколько размеров («S», «M» ...).

В букетах также есть фотографии, которые должны измениться после выбора размера.Существует также цена, которая также меняется с изменением размера.

Теперь таблицы и ссылки:

bouquets_table

id
name

sizes_table

id
name // "S", "M" ...
count
height

цены

id
price

фотографии

id
photo

Я создал множество дляМногие взаимосвязи между этими Букет_размера таблиц

bouquet_id
size_id

В моделях установленного размера Букет и размер принадлежитToMany ().

А теперь, собственно, основные вопросы: возможно ли это?добавить поля price_id и photo_id в промежуточную таблицуquet_size и получить все это через Pivot (я думаю, что это неправильно).

Как связать все 4 таблицы, чтобы при выборе размера букета, фотографии иЦена на этот букет будет выбрана.Я считаю неправильным назначать каждому букету свою цену и фотографию, поскольку я хочу, чтобы один букет имел разные размеры и разные фотографии и цену в зависимости от размера.

Если это возможно, ответьте мне, какреализовать все это в моделях (код).

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 15 марта 2019

Я думаю, вам следует немного изменить классы, чтобы ваше приложение стало понятнее.Оставьте sizes_table , фотографии , цены таблицы как есть.Замените bouquets_table двумя другими.

// the master/main bouquet table
main_bouquets table
id
name

// variations table for each main bouquet with the specified color, price etc
bouquet_variations table
id
main_bouquet_id
price_id
size_id
photo_id

Так что теперь каждый ваш вариант букета сохраняется в таблицеquet_variations, которая должна быть представлена ​​другой моделью, а внутри вы можете добавить любую настройку.для каждой стороны, цвета, цены и любых других атрибутов, которые вы могли бы подумать.

Пока что это может быть немного больше работы, но поверьте мне, это очень поможет вам по мере роста вашего приложения.

0 голосов
/ 15 марта 2019

Я думаю, что вы, возможно, уже ответили на свой вопрос.:) "Можно ли добавить поля price_id и photo_id в промежуточную таблицу bouquet_size и получить все это через Pivot?"Да, и я думаю, что это было бы наиболее подходящим решением здесь.Как вы сказали, вы «хотите, чтобы один букет имел разные размеры и разные фотографии и цену в зависимости от размера», что означает, что фотография и цена зависят от пары букета и размера.Поэтому ваша сводная таблица может содержать значения bouquet_id, size_id, price_id и photo_id.

Вы можете создать сводную модель BouquetSize и определить отношения photo и priceна нем:

public function photo()
{
    return $this->belongsTo('App\Photo');
}

public function price()
{
    return $this->belongsTo('App\Price');
}

Тогда вы можете определить свои отношения sizes на своей модели Bouquet следующим образом:

public function sizes()
{
    return $this->belongsToMany('App\Size')
    ->using('App\BouquetSize')
    ->withPivot([
        'photo_id',
        'price_id',
    ]);
}

Тогда вы сможете получить доступ к ценебукет для такого размера, например, >>> $bouquet->sizes()->first()->pivot->price.

См. «Определение пользовательских промежуточных табличных моделей» документация для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...