为了账号安全,请及时绑定邮箱和手机立即绑定

从 GORM Raw() Query 中检索数据

从 GORM Raw() Query 中检索数据

Go
胡说叔叔 2022-09-05 17:22:42
我试图通过基于项目的学习来学习Golang。我给自己提出的问题是模拟客户将产品添加到购物车。目前,我有这样的模型。Cart.gotype Cart struct {     ID         string         Customer   Customer       CustomerID string         Product    Product        ProductID  string         CreatedAt  time.Time      UpdatedAt  time.Time}在 Cart 模型上,我有一个函数定义为func (c *Cart) GetAllItemsInCart(db *gorm.DB, customer_id string) (*gorm.DB, error) {    items := db.Raw("SELECT id, product_id FROM carts WHERE customer_id = ?", customer_id).Scan(&c)    return items, nil}此函数在控制器中调用func (server *Server) GetAllCartItems(w http.ResponseWriter, r *http.Request) {    vars := mux.Vars(r)    id := vars["id"]    cart := models.Cart{}    items, err := cart.GetAllItemsInCart(server.DB, id)    if err != nil {        responses.ERROR(w, http.StatusInternalServerError, err)        return    }    responses.JSON(w, http.StatusOK, items)}据我所知,目前它将扫描结构的值,或者在这种情况下将找到的数据加载到指定的结构中。但是,我看到的回应是回来的Scan() {    "Value": null,    "Error": null,    "RowsAffected": 2 }这给了我50%的希望,因为“RowsAffected”:2是正确的。但是,有效负载响应显然不是我正在寻找的。任何指导将不胜感激,谢谢。
查看完整描述

2 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

Scan将值放入指向已为其指定的变量的指针中 (),并返回数据库事务对象。您正在调用该事务对象 ,但事实并非如此。项目(即购物车中的内容)位于 中,而不是 返回的内容中。via &citemsc *CartScan


您的方法通过填充它进行修改,它不必返回任何内容,除非您要返回可能返回的错误。cScan


而不是这个...


    items, err := cart.GetAllItemsInCart(server.DB, id)


    // ... 


    responses.JSON(w, http.StatusOK, items)

你应该这样做:


    err := cart.GetAllItemsInCart(server.DB, id)


    // ...


    responses.JSON(w, http.StatusOK, cart)


查看完整回答
反对 回复 2022-09-05
?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

您需要修复以下几点:

  • 您将需要使用而不是因为已经是一个指针。Scan(c)Scan(&c)c

  • 您应该始终检查错误。在您的方法中,您不会通过或检查错误。从技术上讲,您确实传递了它(在对象内部),但您不会在任何地方检查它。GetAllItemsInCartitems

  • 无需将指针向上传递。*gorm.DB

如果你想以你已经开始的方式保留代码的结构,它可能看起来像这样:

func (c *Cart) GetAllItemsInCart(db *gorm.DB, customer_id string) error {

    return db.Raw("SELECT id, product_id FROM carts WHERE customer_id = ?", customer_id).Scan(c).Error

}


// controller

func (server *Server) GetAllCartItems(w http.ResponseWriter, r *http.Request) {

    vars := mux.Vars(r)


    id := vars["id"]


    cart := models.Cart{}


    err := cart.GetAllItemsInCart(server.DB, id)

    if err != nil {

        responses.ERROR(w, http.StatusInternalServerError, err)

        return

    }


    responses.JSON(w, http.StatusOK, cart)

}


查看完整回答
反对 回复 2022-09-05
  • 2 回答
  • 0 关注
  • 211 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号