When querying data using GORM, you may encounter issues scanning the results into a custom data structure. This article explores how to resolve such challenges effectively.
Consider the following code that retrieves data from two tables, users and credit_cards, using a left join:
<code class="go">type res struct { id int number int user_id int } func getDataJoin() { new := []res{} db.Db.Table("users").Select("users.id as id, credit_cards.number as number, credit_cards.user_id as user_id").Joins("left join credit_cards on credit_cards.user_id = users.id").Scan(&new) fmt.Println("user\n", new) }</code>
This query generates the following result:
[ {0 0 0}, {0 0 0}, {0 0 0}, {0 0 0}, {0 0 0}, {0 0 0} ]
Despite obtaining the correct query result set in the database, the new array consists solely of default values.
To address this problem, ensure that the field names in the res struct align with the database column names. By default, GORM expects field names to match column names exactly. Alternatively, you can specify explicit mappings between columns and fields using the gorm tag:
<code class="go">// Solution 1: Public Fields type Res struct { ID int Number int UserID int } // Solution 2: Explicit Mapping type res struct { id int `gorm:"column:id"` number int `gorm:"column:number"` user_id int `gorm:"column:user_id"` }</code>
By applying these solutions, GORM can correctly scan the query results into the new array.
The above is the detailed content of How to Effectively Scan GORM Query Results into Structs: A Guide to Resolving Mapping Issues. For more information, please follow other related articles on the PHP Chinese website!