Как реализовать Relation в Laravel для 3-х таблиц

У меня в database 3 Таблица:

  1. ProductТаблица для хранения продуктов
  2. OptionsТаблица для сохранения значений параметров продуктов, таких как цвета, размеры и другие значения
  3. OptionGroupsТаблица для сохранения группы параметров, таких как размер, цвет, память и ...

В таблице опций у меня есть product_id и optiongroup_id и такое значение: product id 1 имеет группу опций с id 2 и значением X ...

Я хочу иметь динамичныйoptions для каждого product в моем db.

Как я могу записать отношения между этими таблицами?

Я понимаю отношения many to many и many to many polymorphic, но это отношение другое.

Наконец, я хочу иметь method в модели Product, чтобы получать OptionGroups и Options для каждого product.

Есть идея или решение?

ОБНОВИТЬ на картинке ниже мой дизайн БД: Как реализовать Relation в Laravel для 3-х таблиц

Привет, Сэм, я думаю, ты ищешь hasManyThrough отношение. Это?

Alejandro García 20.08.2018 20:45

@ AlejandroGarcía Нет, это не отношение polymorphic many to many, таблица параметров является динамической и имеет значение !!!

hossein masomzadeh 20.08.2018 20:52

Извините @sam, но предложенное мной отношение не является полиморфным. Взгляните на отредактированное решение. Кроме того, я отредактировал ответ перед просмотром вашей модели. То, что у вас есть, существует в отношении многих ко многим между продуктами и группами опций, а продукты - это стержень с дополнительной информацией. Я отредактирую это снова

Alejandro García 20.08.2018 21:06

Я надеюсь, что мое второе издание ответа будет тем подходом, который вы ищете

Alejandro García 20.08.2018 21:37

@ AlejandroGarcía, спасибо, я протестирую, и если сработает, скажу

hossein masomzadeh 20.08.2018 22:09
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
1
5
269
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

При миграции у вас есть:

$table->json('options');

Затем в модели преобразуйте его в массив

protected $casts = [ 'options' => 'array', ];

Позже вы можете использовать его для фильтрации

App\Product::where('options->color', 'red')->get()

Вы можете найти полный пример его использования для метаданных пользователя по этой ссылке:

Использование json-поля mysql в Laravel

Отредактировано

Обновление ответа после разъяснения комментария.

Если вы не хотите использовать поле json, вы можете использовать для этого hasManyThrough отношение.

В вашем случае один товар имеет много optionsgroups через опции, поэтому вы можете:

    class Product extends Model
    {
        public function optionGroups()
        {
            return $this->hasManyThrough(
                'App\OptionGroups',
                'App\Option',
                'product_id', // Foreign key on options table...
                'option_id', // Foreign key on option_groups table...
                'id', // Local key on products table...
                'id' // Local key on options table...
            );
        }
    }

Второе издание

Я обновил ответ после того, как вопрос был обновлен изображением модели. Я не удаляю предыдущую причину, если кому-то она пригодится

Между Продуктами и Группами опций много ко многим с продуктами в виде сводной таблицы. Итак, согласно документации, чтобы извлечь группы из продуктов, вы можете:

    class Product extends Model
    {
        public function optionGroups()
        {
            return $this->belongsToMany('App\OptionGroup', 'options');
        }
    }

И уловка заключается во втором параметре отношения: 'options', который должен быть именем таблицы параметров, которая в этом случае действует как сводная. Laravel не может делать это автоматически из-за того, что имя таблицы не соблюдает соглашение о. Кроме того, возможно, вам нужно передать дополнительный параметр, чтобы указать имена иностранных ключей, которые вы используете, как в примере документа для пользователя и ролей:

return $this->belongsToMany('App\Role', 'role_user', 'user_id', 'role_id');

Думаю, по скриншоту вашей модели вам нужно будет сделать:

return $this->belongsToMany('App\OptionGroup', 'options', 'product_id', 'optiongroup_id');

Но я предлагаю вам прочитать документацию и сделать это в соответствии с вашими конкретными реальными требованиями. Вы можете найти больше информации об этом здесь: отношения многие ко многим.

Надеюсь, это определенно решит вашу проблему.

Я не хочу импортировать детали option в products table. Я хочу использовать отношение или что-то в этом роде и в другой таблице для создания параметров и группы параметров

hossein masomzadeh 20.08.2018 20:34

Будьте осторожны с этим. Если вы используете MariaDB, он пока не поддерживает типы данных JSON, и это не сработает.

user3574492 21.08.2018 14:56

MariaDB поддерживает json с v10.2 @ user3574492, но в любом случае другой объясненный подход не использует поле json.

Alejandro García 21.08.2018 15:03

@ AlejandroGarcía Не сработало ваше решение, в сводной таблице отношения manytomany у меня может быть одно сырье для связи варианта с продуктом, но в моем случае у меня должно быть много сырых для каждого отношения между вариантом и продуктом, думаю, у меня есть продукт с идентификатором 1 и вариант с идентификатором 1, и это отношение повторяется для многих значений, таких как размер: smal x xl xxl

hossein masomzadeh 24.08.2018 12:09

Другие вопросы по теме