Maison > développement back-end > Golang > Ignorer le champ CreateAt lors de la création/mise à jour mais renvoyer la réponse JSON

Ignorer le champ CreateAt lors de la création/mise à jour mais renvoyer la réponse JSON

王林
Libérer: 2024-02-09 17:12:10
avant
1143 Les gens l'ont consulté

Ignorer le champ CreateAt lors de la création/mise à jour mais renvoyer la réponse JSON

Lors d'opérations de création ou de mise à jour de données, nous souhaitons parfois ignorer la valeur du champ crééAt et simplement conserver sa valeur par défaut. Le but est d'utiliser le même horodatage à chaque fois que les données sont créées ou mises à jour, sans provoquer d'incohérence des données en raison de la définition manuelle de l'horodatage. Dans le même temps, nous souhaitons également conserver la valeur par défaut du champ createAt lors du renvoi de la réponse JSON. En PHP, nous pouvons réaliser cette fonction grâce à quelques opérations simples, améliorant ainsi la lisibilité et la maintenabilité du code. Cet article explique comment ignorer le champ CreateAt lors de la création/mise à jour en PHP, mais conserver sa valeur par défaut lors du renvoi d'une réponse JSON.

Contenu des questions

J'ai une structure dans 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:"-"`
}
Copier après la connexion

Et avec contrôleur (itinéraire)

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)
}
Copier après la connexion

Comment ignorer la complétion des champs CreatedAt/UpdatedAt lors de la création ou de la mise à jour d'un objet ? De cette façon, le serveur (et non le client) se charge de remplir les champs, alors que va m'envoyer le JSON ? Cependant, j'ai besoin que la valeur de ce champ soit envoyée au client dans la réponse.

Actuellement, lorsque j'envoie du JSON :

{
    "name": "System 3",
    "createdAt": "2023-12-25T22:04:10.012034+04:00"
}
Copier après la connexion

Gin lie cette valeur à la structure. Pour résumer à nouveau, je souhaite ignorer ces champs d'écriture (lorsqu'ils sont reçus du client) mais les donner dans la réponse de lecture.

J'ai essayé :

Binding : "-" mais cela ne fonctionne pas (validation des enchères)

json : "-" mais cela cache le champ de réponse

Solution de contournement

J'ai longtemps réfléchi à la solution. Après avoir lu les commentaires sous ma question. J'ai fait un choix qui a parfaitement fonctionné pour moi. Cependant, l'approche n'est toujours pas similaire à ce que j'ai utilisé dans d'autres langages (PHP Symfony, Python Django)

Modèle

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
}
Copier après la connexion

Contrôleur (itinéraire)

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)
}
Copier après la connexion

S'il y a de meilleures suggestions, je serai heureux de recevoir des commentaires

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal