Gorm 實現無限樹形菜單

来源:https://www.cnblogs.com/phpper/archive/2023/03/25/17254640.html
-Advertisement-
Play Games

原文鏈接:https://www.zhoubotong.site/post/91.html 通常樹形菜單的實現基本就是遞歸調用,大部分場景畢竟這種數據不多,性能倒是並不突出, 下麵給個demo,有興趣的朋友可以看看: 新建一個city表: CREATE TABLE `city` ( `id` int ...


原文鏈接: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":[]}]}]
無論從事什麼行業,只要做好兩件事就夠了,一個是你的專業、一個是你的人品,專業決定了你的存在,人品決定了你的人脈,剩下的就是堅持,用善良專業和真誠贏取更多的信任。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原創:扣釘日記(微信公眾號ID:codelogs),歡迎分享,非公眾號轉載保留此聲明。 問題發生 上上周,看到一位老哥找我們組同事聯調介面,不知道是什麼問題,兩人坐一起搞了快1個小時,看起來好像有點複雜。 突然,老哥發出一聲卧槽,"我傳參里的+號,到你這怎麼變成了空格!",這個聲音很大,我明顯的聽到 ...
  • 一些用戶界面 數據文件 (XML) 參考: 該主題關聯文檔可以查看Data Files. 上一章,我們通過CSV文件添加了數據。當需要添加數據格式簡單時,用CSV格式還是很方便的,當數據格式更複雜時(比如視圖架構或者一個郵件模板),我們使用XML格式。比如包含HTML tags的 help fiel ...
  • 使用 VLD 記憶體泄漏檢測工具輔助開發時整理的學習筆記。本篇介紹在 QT 中使用 VLD 時,無記憶體泄漏時的輸出報告解析。 ...
  • 之前瞭解到通過UFUN函數UF_UGMGR_invoke_pdm_server可以調用Teamcenter ITK函數,從而可以獲取及編輯Teamcenter對象。UFUN中有樣例代碼,但是就是不知道怎麼使用,今天下午看了幫助文檔,想到需要把ITK的USER_invoke_pdm_server函數進 ...
  • 開發了一個Java庫的Google Bard API,可以自動化與AI對話了 Google Bard是Google提供的還在實驗階段的人工智慧對話服務。這明顯是對標ChatGPT來的,它可以提供更實時的答案,會基於Google強大的網頁數據。 為了更方便的使用並實現自動化,我寫了一個Java類庫,G ...
  • 信號槽連接 信號槽的連接,其實內部本質還是一個回調函數,主要是維護了信號發送Object的元對象里一個連接的列表。調用connect函數時,將槽的一系列信息,封裝成一個Connection,在發送信號時,通過這個列表,去回調槽函數。 1. 信號的連接 下麵列舉一種信號的連接方式,來大致講解一下信號的 ...
  • 零基礎 OpenGL ES 學習路線推薦 : OpenGL ES 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL ES 學習路線推薦 : OpenGL ES 學習目錄 >> OpenGL ES 特效 零基礎 OpenGL ES 學習路線推薦 : OpenGL ES 學習目錄 >> O ...
  • 原文地址: Java/Kotlin 使用Redis模擬發送郵件驗證碼 - Stars-One的雜貨小窩 Java中常用語連接Redis的庫有lettuce和jredis,一般是推薦lettuce,其具有非同步性,下麵兩種都簡單來使用如何實現功能 jredis 1.引入依賴 <dependency> < ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...