首页 > 其他分享 >Gorm 实现无限树形菜单

Gorm 实现无限树形菜单

时间:2023-04-04 14:36:05浏览次数:50  
标签:city 菜单 name INSERT pid id 树形 VALUES Gorm

原文链接:https://www.zhoubotong.site/post/91.html
通常树形菜单的实现基本就是递归调用,大部分场景毕竟这种数据不多,性能倒是并不突出, 下面给个demo,有兴趣的朋友可以看看: 新建一个city表:

CREATE TABLE `city` (
  `id` int NOT NULL AUTO_INCREMENT,
  `pid` int NOT NULL DEFAULT '0' COMMENT '父级别id',
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '名称',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `pid` (`pid`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

测试数据:

INSERT INTO `city` (`id`, `pid`, `name`) VALUES (1, 0, '广东省');
INSERT INTO `city` (`id`, `pid`, `name`) VALUES (2, 1, '广州市');
INSERT INTO `city` (`id`, `pid`, `name`) VALUES (3, 2, '广州天河区');
INSERT INTO `city` (`id`, `pid`, `name`) VALUES (4, 2, '海珠区');
INSERT INTO `city` (`id`, `pid`, `name`) VALUES (5, 0, '福建省');
INSERT INTO `city` (`id`, `pid`, `name`) VALUES (6, 5, '厦门市');
INSERT INTO `city` (`id`, `pid`, `name`) VALUES (7, 4, '新港');
INSERT INTO `city` (`id`, `pid`, `name`) VALUES (8, 4, '沙园');
INSERT INTO `city` (`id`, `pid`, `name`) VALUES (9, 7, '新港一区');
INSERT INTO `city` (`id`, `pid`, `name`) VALUES (10, 0, '湖北省');
INSERT INTO `city` (`id`, `pid`, `name`) VALUES (11, 10, '武汉市');
INSERT INTO `city` (`id`, `pid`, `name`) VALUES (12, 11, '黄陂区');
INSERT INTO `city` (`id`, `pid`, `name`) VALUES (13, 11, '洪山区');
INSERT INTO `city` (`id`, `pid`, `name`) VALUES (14, 12, '黄陂天河街道');

demo.go:

package main

import (
    "encoding/json"
    "fmt"

    "gorm.io/driver/mysql"
    "gorm.io/gorm"
)

var DB gorm.DB

func (u TreeNode) TableName() string {
    return "city"
}

type TreeNode struct {
    Id       int         `json:"id"`
    Pid      int         `json:"pid" gorm:"index"`
    Name     string      `json:"name" gorm:"size:255"`
    Children []*TreeNode `json:"children" gorm:"-"`
}

func init() {
    dsn := "root:uos123456@tcp(11213:3306)/demo?charset=utf8mb4&parseTime=True&loc=Local"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        panic("failed to connect database")
    }
    DB = *db
}
func main() {

    data := TreeList(10) // 查询武汉市下的子节点
    str, _ := json.Marshal(data)
    fmt.Printf("%s\\n", str)

}

// TreeList 递归处理子节点list
func TreeList(pid int) []*TreeNode {
    var list []*TreeNode
    DB.Model(TreeNode{}).Where("pid= ?", pid).Find(&list)
    result := make([]*TreeNode, 0)
    for _, v := range list {
        if v.Pid == pid {
            v.Children = TreeList(v.Id)
            if v.Children == nil {
                v.Children = make([]*TreeNode, 0)
            }
            result = append(result, v)
        }
    }

    return result

}

输出结果:

[Running] go run "/media/uos/G/web/demo-go/demo.go"
[{"id":11,"pid":10,"name":"武汉市","children":[{"id":12,"pid":11,"name":"黄陂区","children":[{"id":14,"pid":12,"name":"黄陂天河街道","children":[]}]},{"id":13,"pid":11,"name":"洪山区","children":[]}]}]

标签:city,菜单,name,INSERT,pid,id,树形,VALUES,Gorm
From: https://www.cnblogs.com/golandhome/p/17286304.html

相关文章

  • js 递归遍历树形结构数据,返回新的数组
    工作中,我们经常会遇到这样的情况:后端返回的数组,只需要取name、value生成新的数组,或者是将某个属性名修改,生成新的数组。递归是一种常见的解决问题的方法,即把问题逐渐简单化。“递归”的基本思想是:自己调用自己。实例如下handleDg(arrs,that){arrs.map((item,index)......
  • HDU 2196 Computer(树形DP) 入门模板
    ComputerTimeLimit:1000/1000MS(Java/Others)    MemoryLimit:32768/32768K(Java/Others)TotalSubmission(s):34313    AcceptedSubmission(s):5345 ProblemDescriptionAschoolboughtthefirstcomputersometimeago(sothiscomputer'sidis1).D......
  • android下拉菜单 spinner 学习
    首先看一下继承关系:publicclassSpinnerextendsAbsSpinnerimplementsDialogInterface.OnClickListenerClassOverview视图在同一时间只能显示一个子项,用户通过下拉的方式可以选择其中的一种项。该子项在Spinner来自来Adpater视图适配器。首先看一下效果图:Spinner控件的使......
  • 全键盘模式,目前按center key 和LSK时候会进入menu 菜单,期望按center键进入编辑
    1.新增如下functrion: /******************************************************************************FUNCTION*jvm_dummy_key_hdlr*DESCRIPTION**PARAMETERS*void*RETURNS*void***************......
  • 零基础Go语言从入门到精通(数据库编程:02-Gorm 操作 MySQL 数据库)
    gin-gorm-api-example/main.goatmaster·cgrant/gin-gorm-api-example·GitHubhttps://github.com/cgrant/gin-gorm-api-example/blob/master/main.goGorm介绍ThefantasticORMlibraryforGolangGo语言的超棒的ORM类库功能强大:全功能ORM(几乎)关联(包含一个,包含多个,属......
  • 成品直播源码推荐,Android 禁止下拉菜单栏
    成品直播源码推荐,Android禁止下拉菜单栏1.屏蔽非锁屏下的下拉菜单栏这种Android系统其实是提供了方法的,只不过是隐藏的,只给系统应用,也就是用mk编译的apk使用。如果第三方应用想要使用,或者Androidstuido编译方式的想要使用。则可以使用反射。 /** *Allowsanapptoco......
  • element树形复选框实现一级菜单单选
      <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"content="width=d......
  • Win11右键菜单如何直接默认显示更多选项
    Win11右键菜单如何直接默认显示更多选项1、首先用鼠标右键点击“开始”按钮(或者按Win+X键),选择点击“Windows终端(管理员2、然后在终端应用程序里粘贴这串代码【reg.exeadd"HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32"/f/......
  • 将WebStorm添加到右键菜单,右键打开当前目录
    注意:软件每次更新之后,由于版本号发生了变动,需要我们手动再修改一遍。注册表编辑器计算机\HKEY_CLASSES_ROOT\Directory\Background\shellWebStorm文件夹见下图数值数据:C:\Users\Lemon\AppData\Local\JetBrains\Toolbox\apps\WebStorm\ch-0\222.3739.57\bin\webstorm64.......
  • 树形DP——小红树
    题目描述小红拿到了一棵树,每个节点被染成了红色或者蓝色。小红定义每条边的权值为:删除这条边时,形成的两个子树的同色连通块数量之差的绝对值。小红想知道,所有边的权值之和是多少?输入描述第一行输入一个正整数n,代表节点的数量。第二行输入一个长度为n且仅由'R'和'B'两种字......