首頁 >後端開發 >Golang >建立/更新時忽略createdAt字段,但回傳JSON回應

建立/更新時忽略createdAt字段,但回傳JSON回應

王林
王林轉載
2024-02-09 17:12:101147瀏覽

建立/更新時忽略createdAt字段,但回傳JSON回應

在進行資料建立或更新操作時,有時我們希望忽略createdAt欄位的值,而只是保留其預設值。這樣做的目的是使得每次建立或更新資料時都使用相同的時間戳,而不會因為手動設定時間戳而導致資料不一致。同時,在回傳JSON回應時,我們也希望保留createdAt欄位的預設值。在PHP中,我們可以透過一些簡單的操作來實現這項功能,從而提高程式碼的可讀性和維護性。本文將為大家介紹如何在PHP中實作建立/更新時忽略createdAt字段,但在傳回JSON回應時保留其預設值。

問題內容

我在 Go 中有一個結構

type ExternalSystem struct {
    ID        uint            `gorm:"primary_key"`
    Name      string          `json:"name" binding:"required"`
    CreatedAt *time.Time      `json:"createdAt" binding:"-"`
    DeletedAt *gorm.DeletedAt `json:"deletedAt" binding:"-"`
}

並有控制器(路線)

func CreateExternalSystemAction(c *gin.Context) {
    appG := app.Gin{C: c}

    externalSystem := models.ExternalSystem{}

    if err := c.ShouldBindJSON(&externalSystem); err != nil {
        appG.C.AbortWithStatusJSON(http.StatusBadRequest, gin.H{
            "error": err.Error(),
        })
        return
    }

    db := models2.DB
    db.Create(&externalSystem)

    appG.C.JSON(http.StatusCreated, externalSystem)
}

func UpdateExternalSystemAction(c *gin.Context) {
    appG := app.Gin{C: c}
    db := models2.DB

    var externalSystem models.ExternalSystem

    db.Where("id = @id", sql.Named("id", c.Param("id"))).First(&externalSystem)

    if err := c.ShouldBindJSON(&externalSystem); err != nil {
        appG.C.AbortWithStatusJSON(http.StatusBadRequest, gin.H{
            "error": err.Error(),
        })
        return
    }

    db.Updates(&externalSystem)

    appG.C.JSON(http.StatusOK, externalSystem)
}

建立或更新物件時如何忽略欄位CreatedAt/UpdatedAt的完成?這樣伺服器(而不是客戶端)負責填寫這些字段,那麼 JSON 會寄給我什麼?但是,我需要該欄位的值在回應中傳送給客戶端。

目前,當我發送 JSON 時:

{
    "name": "System 3",
    "createdAt": "2023-12-25T22:04:10.012034+04:00"
}

Gin 將此值綁定到結構體。再次總結一下,我想忽略這些寫入欄位(當從客戶端收到時),但在讀取回應中給出它們。

我嘗試過:

綁定:“-”,但這不起作用(競價驗證)

json:“-”,但此隱藏回應欄位

解決方法

我想了很長時間的解決方案。在閱讀了我的問題下的評論後。我做了一個完全適合我的選擇。但是,該方法仍然與我在其他語言(PHP Symfony、Python Django)中使用的方法不相似

型號

type System struct {
    ID        uint
    Name      string
    CreatedAt time.Time
    UpdatedAt time.Time
}

type InputSystem struct {
    Name string
}

func (inputSystem *InputSystem) Convert() System {
    system := System{
        Name: inputSystem.Name,
    }
    return system
}

func (system *System) Save() (*System, error) {
    err := DB.Create(system).Error

    if err != nil {
        return &System{}, err
    }

    return system, err
}

func (system *System) BeforeSave(*gorm.DB) error {
    system.Name = html.EscapeString(strings.TrimSpace(system.Name))
    return nil
}

func (system *System) BeforeUpdate(*gorm.DB) error {
    system.Name = html.EscapeString(strings.TrimSpace(system.Name))
    return nil
}

控制器(路線)

func CreateSystemAction(c *gin.Context) {

    var inputSystem models.InputSystem

    if err := c.BindJSON(&inputSystem); err != nil {
        c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{
            "error": err.Error(),
        })
        return
    }

    dbSystem := inputSystem.Convert()

    _, err := dbSystem.Save()
    if err != nil {
        return
    }

    c.JSON(http.StatusCreated, dbSystem)
}

如果有更好的建議,我將很高興收到評論

以上是建立/更新時忽略createdAt字段,但回傳JSON回應的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除