У меня в database 3 Таблица:
ProductТаблица для хранения продуктовOptionsТаблица для сохранения значений параметров продуктов, таких как цвета, размеры и другие значения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.
Есть идея или решение?
@ AlejandroGarcía Нет, это не отношение polymorphic many to many, таблица параметров является динамической и имеет значение !!!
Извините @sam, но предложенное мной отношение не является полиморфным. Взгляните на отредактированное решение. Кроме того, я отредактировал ответ перед просмотром вашей модели. То, что у вас есть, существует в отношении многих ко многим между продуктами и группами опций, а продукты - это стержень с дополнительной информацией. Я отредактирую это снова
Я надеюсь, что мое второе издание ответа будет тем подходом, который вы ищете
@ AlejandroGarcía, спасибо, я протестирую, и если сработает, скажу






Если в вариантах продуктов будет смешанная информация, лучший способ сделать это не имеет никакого отношения. Вместо этого вы должны использовать параметры поля 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. Я хочу использовать отношение или что-то в этом роде и в другой таблице для создания параметров и группы параметров
Будьте осторожны с этим. Если вы используете MariaDB, он пока не поддерживает типы данных JSON, и это не сработает.
MariaDB поддерживает json с v10.2 @ user3574492, но в любом случае другой объясненный подход не использует поле json.
@ AlejandroGarcía Не сработало ваше решение, в сводной таблице отношения manytomany у меня может быть одно сырье для связи варианта с продуктом, но в моем случае у меня должно быть много сырых для каждого отношения между вариантом и продуктом, думаю, у меня есть продукт с идентификатором 1 и вариант с идентификатором 1, и это отношение повторяется для многих значений, таких как размер: smal x xl xxl
Привет, Сэм, я думаю, ты ищешь hasManyThrough отношение. Это?