Пытаюсь отформатировать ответ для API, но я не знаю как - PullRequest
0 голосов
/ 18 апреля 2020

Привет, разработчики. Недавно я ударил стену, пытаясь создать слегка продвинутый запрос со многими многими связями и принадлежит ему, и я успешно извлекал их все с помощью GORM, но я хочу отформатировать ответ на мою выигранную структуру, и я могу ' не делайте этого здесь, мой запрос я gorm

var p []modules.Posts
tm := modules.Tags{}
db.First(&tm , tagID)
//tag and posts has many 2 many rel
//post belongs to user 
tagMaps := db.Model(&tm).Preload("TagMaps").Preload("User").Related(&p,"Posts")

я пытаюсь отформатировать ответ на что-то вроде этого

[
    {
        "id": "post_id",
        "title": "post_title",
        "image" :" post_image",

        "tags":[
            {"name" : "tag_name" , "id" : "tag_id"},
            {"name" : "tag_name" , "id" : "tag_id"},
            {"name" : "tag_name" , "id" : "tag_id"}

        ],
        "user":{
            "id": "user_id",
            "avatar": " user_avatar"
        }

    }
]

это то, что ответ gorm выглядит правильно знать

  {
    "id": 2,
    "title": "thos lore for other users lorem 2",
    "image": "",
    "User": {
        "ID": 1,
        "avatar": "url",
        "user_name": "user 5",
        "email": "newadmin@test.com",
        "password": "password",
        "status": "pea",
        "google_id": "google",
        "facebook_id": "face",
        "account_type": "fb",
        "CreatedAt": "2020-04-02T20:35:38+02:00",
        "UpdatedAt": "2020-04-02T20:35:38+02:00",
        "DeletedAt": null,
        "Posts": null
    },
    "UserRefer": 1,
    "created_at": "2020-04-02T20:36:05+02:00",
    "updated_at": "2020-04-02T20:36:05+02:00",
    "deleted_at": null,
    "TagMaps": [{
            "id": 1,
            "tag_name": "asda",
            "CreatedAt": "2020-04-15T23:25:05+02:00",
            "UpdatedAt": "2020-04-17T21:39:26+02:00",
            "DeletedAt": null,
            "Posts": null
        },
        {
            "id": 2,
            "tag_name": "name",
            "CreatedAt": "2020-04-15T23:25:05+02:00",
            "UpdatedAt": "2020-04-17T21:39:26+02:00",
            "DeletedAt": null,
            "Posts": null
        }
    ]
  },

это мои текущие структуры

type Posts struct {
    ID           uint        `json: "id"`
    Title        string      `json: "title"`
    Image        string      `json: "image"`
    User         *User `gorm: "foreignkey:UserRefer"` // use UserRefer as foreign key
    UserRefer uint
    CreatedAt    time.Time   `json: "created_at"`
    UpdatedAt    time.Time   `json: "updated_at"`
    DeletedAt    *time.Time  `sql: "index" json: "deleted_at"`
    TagMaps      []Tags `gorm: "many2many:tag_maps;association_autoupdate:false;association_autocreate:false;"`
}

type Tags struct {
    ID        uint   `gorm: "primary_key" json: "id"`
    Name      string `json: "tag_name"`
    CreatedAt time.Time
    UpdatedAt time.Time
    DeletedAt *time.Time `sql: "index"`

    Posts        []*Posts `gorm: "many2many:tag_maps"`
}

type User struct {
    ID          uint   `gorm: "primary_key"`
    Avatar      string `json: "avatar" `
    UserName    string `json: "user_name"`
    Password    string `json: "password"`
    Bio         string `json: "bio"`
    GoogleID    string `json: "google_id"`
    FacebookID  string `json: "facebook_id"`
    AccountType string `json: "account_type"`
    CreatedAt   time.Time
    UpdatedAt   time.Time
    DeletedAt   *time.Time `sql: "index"`

    // Relationship
    Posts   *Posts `gorm: "PRELOAD:false"`
}

любой совет будет присваиваться, и мой уровень в go не так хорош, я начал играть с месяцем go

1 Ответ

0 голосов
/ 18 апреля 2020

Не уверен, что вы пытаетесь достичь, но ответ GORM не так далек от того, который вам нужен.

Можете ли вы попытаться добавить больше кодирующего тега json в свои структуры, ie:

  • для игнорирования поля «CreatedAt»
    CreatedAt   time.Time `json:"-"` 
  • для преобразования «пользователя» в «пользователя» (работает и для TagMaps)
    User         *User `gorm: "foreignkey:UserRefer" json:"user"`   

Кстати, есть также json: ", omitempty", чтобы игнорировать пустое поле

https://golang.org/pkg/encoding/json/#Marshal

...