# Membuat Menu Dinamis dengan Array JSON di Golang

<figure><img src="https://3397141630-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FVUQUm1GVUT3pDnRHmDRU%2Fuploads%2F5znDTDR1y12Y09YCLX1I%2FUntitled.png?alt=media&#x26;token=be046e6e-6062-4edb-92ee-20f33aeae302" alt=""><figcaption></figcaption></figure>

Cara membuat Dynamic Menu dengan Array to Array JSON di Golang:

<figure><img src="https://3397141630-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FVUQUm1GVUT3pDnRHmDRU%2Fuploads%2Fto8HFnMewZika9T32NS4%2FUntitled%20(1).png?alt=media&#x26;token=e7dc8bf0-884e-4256-9fe0-711768087627" alt=""><figcaption></figcaption></figure>

Perlu diketahui disini saya buat **hanya 1 table** dan *NavChild* disini hanya sebagai parameter untuk pemanggilan data yang sebenarnya.

Contoh struktur coding dengan menggunakan GORM

<figure><img src="https://3397141630-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FVUQUm1GVUT3pDnRHmDRU%2Fuploads%2FIl1TQ7Ry0EOSmTF5Wb05%2FUntitled%20(2).png?alt=media&#x26;token=5af804b4-54e4-4752-b30e-c87aa6153810" alt=""><figcaption></figcaption></figure>

Configuration

```
import (
	"fmt"
	"log"
	"os"

	"backend/api/controllers"
	"backend/api/seed"

	"github.com/joho/godotenv"
)

var server = controllers.Server{}

//Run function
func Run() {

	var err error
	err = godotenv.Load()
	if err != nil {
		log.Fatalf("Error getting env, not comming through %v", err)
	} else {
		fmt.Println("We are getting the env values")
	}

	server.Initialize(os.Getenv("DB_DRIVER"), os.Getenv("DB_USER"), os.Getenv("DB_PASSWORD"), os.Getenv("DB_PORT"), os.Getenv("DB_HOST"), os.Getenv("DB_NAME"))

	seed.Load(server.DB) // auto migrate

	server.Run(":8010")

}

```

Pertama, buat struct seperti ini

```
package models

import (
	"errors"
	"strings"

	"github.com/jinzhu/gorm"
)

```

```
type Nav struct {
	gorm.Model
	Name     string `gorm:"size:100;not null;" json:"name"`
	ParentId int    `gorm:"size:100;not null;" json:"ParentId"`
	Orderby  int    `gorm:"size:100;not null;" json:"orderby"`
	NavIcon  string `gorm:"size:100;not null;" json:"navicon"`
	NavPath  string `gorm:"size:100;not null;" json:"navpath"`
	NavAcc   string `gorm:"size:100;not null;" json:"navacc"`
	NavChild []Nav  `gorm:"foreignKey:ParentId;" json:"NavChild"`
}

type Navs []Nav

//function get all menu
func (n *Nav) FindAllMenu(db *gorm.DB) (*[]Nav, error) {
	var err error
	navs := []Nav{}
	err = db.Debug().Model(&Nav{}).Preload("NavChild", func(query *gorm.DB) *gorm.DB {
		return query.Order("orderby asc")
	}).Order("orderby asc").Find(&navs).Error
	if err != nil {
		return &[]Nav{}, err
	}

	return &navs, err
}
```

Lalu handler / controller nya seperti ini

```
package controllers

import (
	"backend/api/models"
	"backend/api/responses"
	"net/http"
)

```

```
//Get All Menu function
func (server *Server) GetMenu(w http.ResponseWriter, r *http.Request) {

	nav := models.Nav{}

	navs, err := nav.FindAllMenu(server.DB)
	if err != nil {
		responses.ERROR(w, http.StatusInternalServerError, err)
		return
	}
	responses.JSON(w, http.StatusOK, navs)
}
```

Selanjutnya untuk data seeder sebagai berikut

```
package seed

import (
	"backend/api/models"
	"log"

	"github.com/jinzhu/gorm"
)

```

```
var navs = []models.Nav{
	models.Nav{
		Name:     "Report",
		ParentId: 0,
		Orderby:  3,
		NavIcon:  "fa-key",
		NavPath:  "/",
		NavAcc:   "public",
		NavChild: []models.Nav{
			models.Nav{
				Name:     "Timesheet",
				ParentId: 3,
				Orderby:  6,
				NavIcon:  "fa-check",
				NavPath:  "/Report",
				NavAcc:   "public",
			},
		},
	},
}
```

**ParentId** sebagai foreignkey dari ID table tersebut

Jika menggunakan AutoMigration tambahkan ini

```
//Load function
func Load(db *gorm.DB) {

	err := db.Debug().DropTableIfExists(&models.User{}, &models.Roles{}, &models.Nav{}, &models.Activity{}).Error
	if err != nil {
		log.Fatalf("cannot drop table: %v", err)
	}

	err = db.Debug().AutoMigrate(&models.User{}, &models.Roles{}, &models.Nav{}, &models.Activity{}).Error
	if err != nil {
		log.Fatalf("cannot migrate table: %v", err)
	}

	for n, _ := range navs {
		err = db.Debug().Model(&models.Nav{}).Create(&navs[n]).Error
		if err != nil {
			log.Fatalf("cannot seed nav table: %v", err)
		}
	}
}
```

Sekian, Gomawo^-^
