首頁  >  文章  >  後端開發  >  如何從 Gorm 物件取得列名稱和值?

如何從 Gorm 物件取得列名稱和值?

WBOY
WBOY轉載
2024-02-09 15:30:091182瀏覽

如何从 Gorm 对象获取列名称和值?

php小編草莓在程式開發中,我們常會使用Gorm物件進行資料庫操作。而有時候,我們需要從Gorm物件中取得列名稱和對應的值。那麼,要如何實現這個需求呢?在Gorm中,我們可以透過反射來取得物件的屬性和值,並結合Gorm的標籤來取得列名稱。接下來,我將為大家詳細介紹如何從Gorm物件中取得列名稱和值的方法。讓我們一起來看看吧!

問題內容

我想寫一個函數,它可以取得從資料庫載入的任何物件(透過 gorm)並列印出所有列名稱和值。顯然,關鍵部分是將我的任何 Gorm 模型傳遞到此函數中的能力。我沒有在下面展示這些,因為它們都很簡單。

到目前為止,我擁有的是一個帶有介面的函數,以及一些呼叫它的測試程式碼:

func testfunc(s interface{}) {

    // type
    v := reflect.TypeOf(s)

    fmt.Println(v)

    // fields?
    for i := 0; i < v.NumField(); i++ {
        fmt.Println(i)
    }
}
trans := make([]orm.Trans, 0)

    db.Where("state = ?", state.FINISHED).Limit(1).Find(&trans)

    testfunc(trans)

運行時,會列印出類型,然後出現恐慌:

[]orm.Trans
panic: reflect: call of reflect.Value.NumField on slice Value

我是新手,所以歡迎你的想法。看來我可能的選擇是:

  • 使用反射(如果適用於切片)
  • 以某種方式尋找模型中的欄位?
  • 還有其他想法嗎?

謝謝。

解決方法

嘗試這種方法:

func testfunc(x interface{}){
        v := reflect.ValueOf(x)
        s := reflect.TypeOf(x)
        names:=make([]interface{},v.NumField())
        values := make([]interface{}, v.NumField())

        for i := 0; i < v.NumField(); i++ {
                values[i] = v.Field(i).Interface()
                names[i] = s.Field(i).Name
        }
        fmt.Println("Names",names)
        fmt.Println("values",values)

}

1-您正在傳遞結構體切片。 (如果使用切片,請避免在循環中呼叫上面的函數。)

2-我正在將此結構傳遞給上面的函數

x := struct {
                Name string
                Id int
        }{"Zargham", 2}

3-取得輸出:-

Names [Name Id]
values [Zargham 2]

以上是如何從 Gorm 物件取得列名稱和值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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