You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Laravel中构建多级电商菜单?数据库关联配置求助

电商多层分类的数据库关联与Laravel实现方案

一、数据库表设计(自关联单表方案)

不用给每一层分类单独建表,一张categories表就能搞定所有层级,扩展性更强:

CREATE TABLE categories (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    parent_id INT DEFAULT 0 COMMENT '父分类ID,0表示主分类',
    slug VARCHAR(255) UNIQUE COMMENT '友好URL标识',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
  • 主分类的parent_id设为0(或NULL,根据习惯选择)
  • 子分类的parent_id对应父分类的id,比如Intel的parent_id对应CPU分类的id,i3的parent_id对应Intel的id

二、Laravel模型关联设置

在app/Models/Category.php里定义自关联关系:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

class Category extends Model
{
    protected $fillable = ['name', 'parent_id', 'slug'];

    // 关联子分类(一对多,递归加载子分类的子分类)
    public function children(): HasMany
    {
        return $this->hasMany(Category::class, 'parent_id')->with('children');
    }

    // 关联父分类(多对一)
    public function parent(): BelongsTo
    {
        return $this->belongsTo(Category::class, 'parent_id');
    }
}

三、控制器获取分类数据

直接获取所有主分类,并自动加载所有层级的子分类:

// 示例:CategoryController
public function index()
{
    // 获取parent_id为0的主分类,同时预加载所有子分类层级
    $mainCategories = Category::where('parent_id', 0)->get();
    
    return view('categories.menu', compact('mainCategories'));
}

四、视图渲染(递归处理任意层级)

不用写死多层foreach,用Blade递归引用更灵活:

  1. 创建子视图组件resources/views/categories/_menu_item.blade.php:
<div class="category-item">
    <h{{ $level }}>{{ $category->name }}</h{{ $level }}>
    @if($category->children->isNotEmpty())
        <div class="subcategories">
            @foreach($category->children as $child)
                @include('categories._menu_item', [
                    'category' => $child,
                    'level' => $level + 1
                ])
            @endforeach
        </div>
    @endif
</div>
  1. 在主视图resources/views/categories/menu.blade.php调用:
<div class="main-menu">
    @foreach($mainCategories as $category)
        @include('categories._menu_item', [
            'category' => $category,
            'level' => 1
        ])
    @endforeach
</div>

补充说明

  • 不推荐用多层独立表的方案,新增层级就要修改表结构,扩展性极差;自关联方案能轻松支持任意层级分类,后续维护成本低。
  • 如果需要对分类做额外字段区分,可在categories表新增type字段,不用拆分表。

内容的提问来源于stack exchange,提问作者Tập Cận Bình

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 14:42:52