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.
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:"-"` }
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) }
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" }
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
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 }
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) }
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!