Как реализовать в магазине Категории- подкатегории - подкатегории? Чтоб у каждой подкатегории были свои подкатегории? В миграции сделал привязку товара к категории category_id. Так делать и подкатегориям? К подкатегориям тоже сделать свою таблицу или есть какие-то другие варианты?
Обычно для структуры категорий/подкатегории делается одна таблица, где есть поле parent_id указывающего на родителя данной категории/подкатегории, для корневой категории это null
У меня будет несколько подкатегорий. То есть категории category_id - подкатегории parent_id - подкатегории children_id.Так?
Нет, в БД сохраняются только ссылки на родителей. Чтобы получить список непосредственных потомков, нужно сделать запрос с условием parent_id=$category_id [AND category_id!=$category_id или parent_id!=category_id, когда корневая идентифицируется не null'ом, а ссылкой на себя].
Если я правильно понял. PHP: <?php $a = [ ["id" => 1, "name" => 1, "level" => 1], ["id" => 2, "name" => 2, "level" => 2], ["id" => 3, "name" => 3, "level" => 2], ["id" => 4, "name" => 4, "level" => 3], ["id" => 5, "name" => 5, "level" => 4], ["id" => 6, "name" => 6, "level" => 2], ["id" => 7, "name" => 7, "level" => 7], ["id" => 8, "name" => 8, "level" => 2], ]; function d ( array $arr ) { $l = 0; foreach ( $arr AS [ 'name' => $name, 'level' => $lvl ] ) { if ( $l < $lvl ) { echo str_repeat ( '<ul><li>', $lvl - $l ) . $name; $l = $lvl; } elseif ( $l === $lvl ) { echo '</li><li>' . $name; } elseif ( $l > $lvl ) { echo str_repeat ( '</li></ul>', $l - $lvl ) . '<li>' .$name; $l = $lvl; } } echo str_repeat ( '</li></ul>', $l ); } echo d ( $a ) . PHP_EOL;
К чему-то это? Я хочу реализовать . Категории category_id - подкатегории parent_id - подкатегории children_id. НРапример, у магазина розетки 2 подкатегории
https://gist.github.com/codedokode/10539720 К примеру Я люблю Nested Sets, и они достаточно неплохо поддерживаются расширениями Laravel В MySQL 8 появились рекурсивные запросы, которые, по идее, практически убирают необходимость в сложных решениях типа Nested Sets, но я с ними ещё не игрался на проектах. https://www.mysqltutorial.org/mysql-adjacency-list-tree/ Инфы, короче, навалом.
Код (Text): Простая схема для таблицы: Schema::create('categories', function (Blueprint $table) { $table->bigIncrements('id'); $table->string('name'); $table->unsignedBigInteger('category_id')->nullable(); $table->foreign('category_id')->references('id')->on('categories'); $table->timestamps(); }); нашел примерную реализацию
Имхо не очень удачно название category_id, parent_id привычнее Ну а в целом, это то что что вам и говорили
Товар ссылется на конечную категорию. Независимо от того, на какой "глубине" дерева категорий она находится. Ссылка одна. Сама категория может ссылаться на родительскую категорию, а та на свою родительскую категорию и т.д. Образуется "дерево" категорий. Варианты есть, но ты ими не увлекайся. Сделай как попроще. Поле categories.parent_id решает всё. Главное — добиться чтобы работало. Это ключ ко всему. --- Добавлено --- Твоя проблема, Убунта, что ты нифига не доводишь до конца. Ты просто накапливаешь кучу новых слов, вываливаешь на форумы новые вопросы "как" и топаешь дальше к новым "ничего не получилось". Ты добейся результата в малом, потом чуть усложни и снова добейся. И так расти. Вопросы, которые не опираются на опыт, ничего не дают кроме потери времени.