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,110 @@ 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+ return User {
185+ ID : 1 ,
186+ Email : "john@example.com" ,
187+ Avatar : convert .Pointer ("avatar.jpg" ),
188+ Alias : convert .Pointer (42 ),
189+ Body : Body {Weight : "100kg" , Head : & head , DateTime : * dateTime },
190+ House : & House {Address : "123 Main St" , Size : convert .Pointer (100 )},
191+ Job : Job {Title : "Engineer" , Salary : convert .Pointer (50000.0 )},
192+ TestTimestamps : TestTimestamps {CreatedAt : dateTime , UpdatedAt : dateTime },
193+ }
194+ }(),
195+ want : []map [string ]any {
196+ {
197+ "id" : 1 , "email" : "john@example.com" , "avatar" : convert .Pointer ("avatar.jpg" ),
198+ "alias" : convert .Pointer (42 ), "weight" : "100kg" , "head" : & head , "date_time" : * dateTime ,
199+ "house" : & House {Address : "123 Main St" , Size : convert .Pointer (100 )},
200+ "job" : Job {Title : "Engineer" , Salary : convert .Pointer (50000.0 )},
201+ "created_at" : dateTime , "updated_at" : dateTime ,
202+ },
203+ },
204+ },
205+ {
206+ name : "user slice with mixed nested structs" ,
207+ data : []User {
208+ {
209+ ID : 1 ,
210+ Email : "john@example.com" ,
211+ Body : Body {Length : 10 , Weight : "100kg" , Head : & head , DateTime : * dateTime },
212+ House : & House {Address : "123 Main St" },
213+ Job : Job {Title : "Engineer" },
214+ TestTimestamps : TestTimestamps {CreatedAt : dateTime , UpdatedAt : dateTime },
215+ },
216+ {
217+ ID : 2 ,
218+ Email : "jane@example.com" ,
219+ Body : Body {Weight : "90kg" , DateTime : * dateTime },
220+ House : nil ,
221+ Job : Job {Title : "Designer" },
222+ TestTimestamps : TestTimestamps {CreatedAt : dateTime , UpdatedAt : dateTime },
223+ },
224+ },
225+ want : []map [string ]any {
226+ {
227+ "id" : 1 , "email" : "john@example.com" , "length" : 10 , "weight" : "100kg" , "head" : & head , "date_time" : * dateTime ,
228+ "house" : & House {Address : "123 Main St" },
229+ "job" : Job {Title : "Engineer" },
230+ "created_at" : dateTime , "updated_at" : dateTime ,
231+ },
232+ {
233+ "id" : 2 , "email" : "jane@example.com" , "weight" : "90kg" , "date_time" : * dateTime ,
234+ "job" : Job {Title : "Designer" },
235+ "created_at" : dateTime , "updated_at" : dateTime ,
236+ },
237+ },
238+ },
239+ {
240+ name : "user with all zero values" ,
241+ data : User {},
242+ want : []map [string ]any {
243+ {},
244+ },
245+ },
127246 }
128247
129248 for _ , tt := range tests {
0 commit comments