88 "gorm.io/gorm"
99
1010 "github.com/goravel/framework/support/carbon"
11+ "github.com/goravel/framework/support/convert"
1112)
1213
1314type Body struct {
@@ -20,11 +21,25 @@ type Body struct {
2021 leg int `db:"leg"`
2122}
2223
24+ type House struct {
25+ Address string `db:"address"`
26+ Size * int `db:"size"`
27+ }
28+
29+ type Job struct {
30+ Title string `db:"title"`
31+ Salary * float64 `db:"salary"`
32+ }
33+
2334type User struct {
24- ID int `db:"id"`
25- Name string `db:"-"`
26- Email string
35+ ID int `db:"id"`
36+ Name string `db:"-"`
37+ Email string
38+ Avatar * string
39+ Alias * int
2740 Body
41+ House * House
42+ Job Job
2843 TestSoftDeletes
2944 TestTimestamps
3045}
@@ -124,6 +139,114 @@ func TestConvertToSliceMap(t *testing.T) {
124139 },
125140 want : []map [string ]any {{"weight" : "100kg" , "Age" : 25 }, {"weight" : "90kg" , "Age" : 20 }},
126141 },
142+ {
143+ name : "user with nested struct pointer" ,
144+ data : User {
145+ ID : 1 ,
146+ Name : "John" ,
147+ Email : "john@example.com" ,
148+ Body : Body {Weight : "100kg" , Head : & head , DateTime : * dateTime },
149+ House : & House {Address : "123 Main St" , Size : nil },
150+ Job : Job {Title : "Engineer" , Salary : nil },
151+ TestSoftDeletes : TestSoftDeletes {DeletedAt : deletedAt },
152+ TestTimestamps : TestTimestamps {CreatedAt : dateTime , UpdatedAt : dateTime },
153+ },
154+ want : []map [string ]any {
155+ {
156+ "id" : 1 , "email" : "john@example.com" , "weight" : "100kg" , "head" : & head , "date_time" : * dateTime ,
157+ "house" : & House {Address : "123 Main St" , Size : nil },
158+ "job" : Job {Title : "Engineer" , Salary : nil },
159+ "created_at" : dateTime , "updated_at" : dateTime , "deleted_at" : deletedAt ,
160+ },
161+ },
162+ },
163+ {
164+ name : "user with nil nested struct pointer" ,
165+ data : User {
166+ ID : 1 ,
167+ Email : "john@example.com" ,
168+ Body : Body {Weight : "100kg" , DateTime : * dateTime },
169+ House : nil ,
170+ Job : Job {Title : "Engineer" },
171+ TestTimestamps : TestTimestamps {CreatedAt : dateTime , UpdatedAt : dateTime },
172+ },
173+ want : []map [string ]any {
174+ {
175+ "id" : 1 , "email" : "john@example.com" , "weight" : "100kg" , "date_time" : * dateTime ,
176+ "job" : Job {Title : "Engineer" },
177+ "created_at" : dateTime , "updated_at" : dateTime ,
178+ },
179+ },
180+ },
181+ {
182+ name : "user with pointer fields" ,
183+ data : func () User {
184+ avatar := "avatar.jpg"
185+ alias := 42
186+ size := 100
187+ salary := 50000.0
188+ return User {
189+ ID : 1 ,
190+ Email : "john@example.com" ,
191+ Avatar : & avatar ,
192+ Alias : & alias ,
193+ Body : Body {Weight : "100kg" , Head : & head , DateTime : * dateTime },
194+ House : & House {Address : "123 Main St" , Size : & size },
195+ Job : Job {Title : "Engineer" , Salary : & salary },
196+ TestTimestamps : TestTimestamps {CreatedAt : dateTime , UpdatedAt : dateTime },
197+ }
198+ }(),
199+ want : []map [string ]any {
200+ {
201+ "id" : 1 , "email" : "john@example.com" , "avatar" : convert .Pointer ("avatar.jpg" ),
202+ "alias" : convert .Pointer (42 ), "weight" : "100kg" , "head" : & head , "date_time" : * dateTime ,
203+ "house" : & House {Address : "123 Main St" , Size : convert .Pointer (100 )},
204+ "job" : Job {Title : "Engineer" , Salary : convert .Pointer (50000.0 )},
205+ "created_at" : dateTime , "updated_at" : dateTime ,
206+ },
207+ },
208+ },
209+ {
210+ name : "user slice with mixed nested structs" ,
211+ data : []User {
212+ {
213+ ID : 1 ,
214+ Email : "john@example.com" ,
215+ Body : Body {Length : 10 , Weight : "100kg" , Head : & head , DateTime : * dateTime },
216+ House : & House {Address : "123 Main St" },
217+ Job : Job {Title : "Engineer" },
218+ TestTimestamps : TestTimestamps {CreatedAt : dateTime , UpdatedAt : dateTime },
219+ },
220+ {
221+ ID : 2 ,
222+ Email : "jane@example.com" ,
223+ Body : Body {Weight : "90kg" , DateTime : * dateTime },
224+ House : nil ,
225+ Job : Job {Title : "Designer" },
226+ TestTimestamps : TestTimestamps {CreatedAt : dateTime , UpdatedAt : dateTime },
227+ },
228+ },
229+ want : []map [string ]any {
230+ {
231+ "id" : 1 , "email" : "john@example.com" , "length" : 10 , "weight" : "100kg" , "head" : & head , "date_time" : * dateTime ,
232+ "house" : & House {Address : "123 Main St" },
233+ "job" : Job {Title : "Engineer" },
234+ "created_at" : dateTime , "updated_at" : dateTime ,
235+ },
236+ {
237+ "id" : 2 , "email" : "jane@example.com" , "weight" : "90kg" , "date_time" : * dateTime ,
238+ "job" : Job {Title : "Designer" },
239+ "created_at" : dateTime , "updated_at" : dateTime ,
240+ },
241+ },
242+ },
243+ {
244+ name : "user with all zero values" ,
245+ data : User {},
246+ want : []map [string ]any {
247+ {},
248+ },
249+ },
127250 }
128251
129252 for _ , tt := range tests {
0 commit comments