github.com/gogf/gf@v1.16.9/database/gdb/gdb_z_mysql_association_with_test.go (about) 1 // Copyright GoFrame Author(https://goframe.org). All Rights Reserved. 2 // 3 // This Source Code Form is subject to the terms of the MIT License. 4 // If a copy of the MIT was not distributed with this file, 5 // You can obtain one at https://github.com/gogf/gf. 6 7 package gdb_test 8 9 import ( 10 "fmt" 11 "github.com/gogf/gf/debug/gdebug" 12 "github.com/gogf/gf/frame/g" 13 "github.com/gogf/gf/os/gfile" 14 "github.com/gogf/gf/test/gtest" 15 "github.com/gogf/gf/text/gstr" 16 "github.com/gogf/gf/util/gmeta" 17 "testing" 18 ) 19 20 /* 21 mysql> show tables; 22 +----------------+ 23 | Tables_in_test | 24 +----------------+ 25 | user | 26 | user_detail | 27 | user_score | 28 +----------------+ 29 3 rows in set (0.01 sec) 30 31 mysql> select * from `user`; 32 +----+--------+ 33 | id | name | 34 +----+--------+ 35 | 1 | name_1 | 36 | 2 | name_2 | 37 | 3 | name_3 | 38 | 4 | name_4 | 39 | 5 | name_5 | 40 +----+--------+ 41 5 rows in set (0.01 sec) 42 43 mysql> select * from `user_detail`; 44 +-----+-----------+ 45 | uid | address | 46 +-----+-----------+ 47 | 1 | address_1 | 48 | 2 | address_2 | 49 | 3 | address_3 | 50 | 4 | address_4 | 51 | 5 | address_5 | 52 +-----+-----------+ 53 5 rows in set (0.00 sec) 54 55 mysql> select * from `user_score`; 56 +----+-----+-------+ 57 | id | uid | score | 58 +----+-----+-------+ 59 | 1 | 1 | 1 | 60 | 2 | 1 | 2 | 61 | 3 | 1 | 3 | 62 | 4 | 1 | 4 | 63 | 5 | 1 | 5 | 64 | 6 | 2 | 1 | 65 | 7 | 2 | 2 | 66 | 8 | 2 | 3 | 67 | 9 | 2 | 4 | 68 | 10 | 2 | 5 | 69 | 11 | 3 | 1 | 70 | 12 | 3 | 2 | 71 | 13 | 3 | 3 | 72 | 14 | 3 | 4 | 73 | 15 | 3 | 5 | 74 | 16 | 4 | 1 | 75 | 17 | 4 | 2 | 76 | 18 | 4 | 3 | 77 | 19 | 4 | 4 | 78 | 20 | 4 | 5 | 79 | 21 | 5 | 1 | 80 | 22 | 5 | 2 | 81 | 23 | 5 | 3 | 82 | 24 | 5 | 4 | 83 | 25 | 5 | 5 | 84 +----+-----+-------+ 85 25 rows in set (0.00 sec) 86 */ 87 88 func Test_Table_Relation_With_Scan(t *testing.T) { 89 var ( 90 tableUser = "user" 91 tableUserDetail = "user_detail" 92 tableUserScores = "user_score" 93 ) 94 if _, err := db.Exec(fmt.Sprintf(` 95 CREATE TABLE IF NOT EXISTS %s ( 96 id int(10) unsigned NOT NULL AUTO_INCREMENT, 97 name varchar(45) NOT NULL, 98 PRIMARY KEY (id) 99 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 100 `, tableUser)); err != nil { 101 gtest.Error(err) 102 } 103 defer dropTable(tableUser) 104 105 if _, err := db.Exec(fmt.Sprintf(` 106 CREATE TABLE IF NOT EXISTS %s ( 107 uid int(10) unsigned NOT NULL AUTO_INCREMENT, 108 address varchar(45) NOT NULL, 109 PRIMARY KEY (uid) 110 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 111 `, tableUserDetail)); err != nil { 112 gtest.Error(err) 113 } 114 defer dropTable(tableUserDetail) 115 116 if _, err := db.Exec(fmt.Sprintf(` 117 CREATE TABLE IF NOT EXISTS %s ( 118 id int(10) unsigned NOT NULL AUTO_INCREMENT, 119 uid int(10) unsigned NOT NULL, 120 score int(10) unsigned NOT NULL, 121 PRIMARY KEY (id) 122 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 123 `, tableUserScores)); err != nil { 124 gtest.Error(err) 125 } 126 defer dropTable(tableUserScores) 127 128 type UserDetail struct { 129 gmeta.Meta `orm:"table:user_detail"` 130 Uid int `json:"uid"` 131 Address string `json:"address"` 132 } 133 134 type UserScore struct { 135 gmeta.Meta `orm:"table:user_score"` 136 Id int `json:"id"` 137 Uid int `json:"uid"` 138 Score int `json:"score"` 139 } 140 141 type User struct { 142 gmeta.Meta `orm:"table:user"` 143 Id int `json:"id"` 144 Name string `json:"name"` 145 UserDetail *UserDetail `orm:"with:uid=id"` 146 UserScores []*UserScore `orm:"with:uid=id"` 147 } 148 149 // Initialize the data. 150 gtest.C(t, func(t *gtest.T) { 151 for i := 1; i <= 5; i++ { 152 // User. 153 user := User{ 154 Name: fmt.Sprintf(`name_%d`, i), 155 } 156 lastInsertId, err := db.Model(user).Data(user).OmitEmpty().InsertAndGetId() 157 t.AssertNil(err) 158 // Detail. 159 userDetail := UserDetail{ 160 Uid: int(lastInsertId), 161 Address: fmt.Sprintf(`address_%d`, lastInsertId), 162 } 163 _, err = db.Model(userDetail).Data(userDetail).OmitEmpty().Insert() 164 t.AssertNil(err) 165 // Scores. 166 for j := 1; j <= 5; j++ { 167 userScore := UserScore{ 168 Uid: int(lastInsertId), 169 Score: j, 170 } 171 _, err = db.Model(userScore).Data(userScore).OmitEmpty().Insert() 172 t.AssertNil(err) 173 } 174 } 175 }) 176 for i := 1; i <= 5; i++ { 177 // User. 178 user := User{ 179 Name: fmt.Sprintf(`name_%d`, i), 180 } 181 lastInsertId, err := db.Model(user).Data(user).OmitEmpty().InsertAndGetId() 182 gtest.AssertNil(err) 183 // Detail. 184 userDetail := UserDetail{ 185 Uid: int(lastInsertId), 186 Address: fmt.Sprintf(`address_%d`, lastInsertId), 187 } 188 _, err = db.Model(userDetail).Data(userDetail).Insert() 189 gtest.AssertNil(err) 190 // Scores. 191 for j := 1; j <= 5; j++ { 192 userScore := UserScore{ 193 Uid: int(lastInsertId), 194 Score: j, 195 } 196 _, err = db.Model(userScore).Data(userScore).Insert() 197 gtest.AssertNil(err) 198 } 199 } 200 gtest.C(t, func(t *gtest.T) { 201 var user *User 202 err := db.With(User{}). 203 With(User{}.UserDetail). 204 With(User{}.UserScores). 205 Where("id", 3). 206 Scan(&user) 207 t.AssertNil(err) 208 t.Assert(user.Id, 3) 209 t.AssertNE(user.UserDetail, nil) 210 t.Assert(user.UserDetail.Uid, 3) 211 t.Assert(user.UserDetail.Address, `address_3`) 212 t.Assert(len(user.UserScores), 5) 213 t.Assert(user.UserScores[0].Uid, 3) 214 t.Assert(user.UserScores[0].Score, 1) 215 t.Assert(user.UserScores[4].Uid, 3) 216 t.Assert(user.UserScores[4].Score, 5) 217 }) 218 gtest.C(t, func(t *gtest.T) { 219 var user User 220 err := db.With(user). 221 With(user.UserDetail). 222 With(user.UserScores). 223 Where("id", 4). 224 Scan(&user) 225 t.AssertNil(err) 226 t.Assert(user.Id, 4) 227 t.AssertNE(user.UserDetail, nil) 228 t.Assert(user.UserDetail.Uid, 4) 229 t.Assert(user.UserDetail.Address, `address_4`) 230 t.Assert(len(user.UserScores), 5) 231 t.Assert(user.UserScores[0].Uid, 4) 232 t.Assert(user.UserScores[0].Score, 1) 233 t.Assert(user.UserScores[4].Uid, 4) 234 t.Assert(user.UserScores[4].Score, 5) 235 }) 236 gtest.C(t, func(t *gtest.T) { 237 var user *User 238 err := db.With(User{}). 239 With(UserDetail{}). 240 With(UserScore{}). 241 Where("id", 4). 242 Scan(&user) 243 t.AssertNil(err) 244 t.Assert(user.Id, 4) 245 t.AssertNE(user.UserDetail, nil) 246 t.Assert(user.UserDetail.Uid, 4) 247 t.Assert(user.UserDetail.Address, `address_4`) 248 t.Assert(len(user.UserScores), 5) 249 t.Assert(user.UserScores[0].Uid, 4) 250 t.Assert(user.UserScores[0].Score, 1) 251 t.Assert(user.UserScores[4].Uid, 4) 252 t.Assert(user.UserScores[4].Score, 5) 253 }) 254 // With part attribute: UserDetail. 255 gtest.C(t, func(t *gtest.T) { 256 var user User 257 err := db.With(user). 258 With(user.UserDetail). 259 Where("id", 4). 260 Scan(&user) 261 t.AssertNil(err) 262 t.Assert(user.Id, 4) 263 t.AssertNE(user.UserDetail, nil) 264 t.Assert(user.UserDetail.Uid, 4) 265 t.Assert(user.UserDetail.Address, `address_4`) 266 t.Assert(len(user.UserScores), 0) 267 }) 268 // With part attribute: UserScores. 269 gtest.C(t, func(t *gtest.T) { 270 var user User 271 err := db.With(user). 272 With(user.UserScores). 273 Where("id", 4). 274 Scan(&user) 275 t.AssertNil(err) 276 t.Assert(user.Id, 4) 277 t.Assert(user.UserDetail, nil) 278 t.Assert(len(user.UserScores), 5) 279 t.Assert(user.UserScores[0].Uid, 4) 280 t.Assert(user.UserScores[0].Score, 1) 281 t.Assert(user.UserScores[4].Uid, 4) 282 t.Assert(user.UserScores[4].Score, 5) 283 }) 284 } 285 286 func Test_Table_Relation_With(t *testing.T) { 287 var ( 288 tableUser = "user" 289 tableUserDetail = "user_detail" 290 tableUserScores = "user_scores" 291 ) 292 if _, err := db.Exec(fmt.Sprintf(` 293 CREATE TABLE IF NOT EXISTS %s ( 294 id int(10) unsigned NOT NULL AUTO_INCREMENT, 295 name varchar(45) NOT NULL, 296 PRIMARY KEY (id) 297 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 298 `, tableUser)); err != nil { 299 gtest.Error(err) 300 } 301 defer dropTable(tableUser) 302 303 if _, err := db.Exec(fmt.Sprintf(` 304 CREATE TABLE IF NOT EXISTS %s ( 305 uid int(10) unsigned NOT NULL AUTO_INCREMENT, 306 address varchar(45) NOT NULL, 307 PRIMARY KEY (uid) 308 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 309 `, tableUserDetail)); err != nil { 310 gtest.Error(err) 311 } 312 defer dropTable(tableUserDetail) 313 314 if _, err := db.Exec(fmt.Sprintf(` 315 CREATE TABLE IF NOT EXISTS %s ( 316 id int(10) unsigned NOT NULL AUTO_INCREMENT, 317 uid int(10) unsigned NOT NULL, 318 score int(10) unsigned NOT NULL, 319 PRIMARY KEY (id) 320 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 321 `, tableUserScores)); err != nil { 322 gtest.Error(err) 323 } 324 defer dropTable(tableUserScores) 325 326 type UserDetail struct { 327 gmeta.Meta `orm:"table:user_detail"` 328 Uid int `json:"uid"` 329 Address string `json:"address"` 330 } 331 332 type UserScores struct { 333 gmeta.Meta `orm:"table:user_scores"` 334 Id int `json:"id"` 335 Uid int `json:"uid"` 336 Score int `json:"score"` 337 } 338 339 type User struct { 340 gmeta.Meta `orm:"table:user"` 341 Id int `json:"id"` 342 Name string `json:"name"` 343 UserDetail *UserDetail `orm:"with:uid=id"` 344 UserScores []*UserScores `orm:"with:uid=id"` 345 } 346 347 // Initialize the data. 348 var err error 349 for i := 1; i <= 5; i++ { 350 // User. 351 _, err = db.Insert(tableUser, g.Map{ 352 "id": i, 353 "name": fmt.Sprintf(`name_%d`, i), 354 }) 355 gtest.Assert(err, nil) 356 // Detail. 357 _, err = db.Insert(tableUserDetail, g.Map{ 358 "uid": i, 359 "address": fmt.Sprintf(`address_%d`, i), 360 }) 361 gtest.Assert(err, nil) 362 // Scores. 363 for j := 1; j <= 5; j++ { 364 _, err = db.Insert(tableUserScores, g.Map{ 365 "uid": i, 366 "score": j, 367 }) 368 gtest.Assert(err, nil) 369 } 370 } 371 372 gtest.C(t, func(t *gtest.T) { 373 var users []*User 374 err := db.With(User{}). 375 With(User{}.UserDetail). 376 With(User{}.UserScores). 377 Where("id", []int{3, 4}). 378 Scan(&users) 379 t.AssertNil(err) 380 t.Assert(len(users), 2) 381 t.Assert(users[0].Id, 3) 382 t.Assert(users[0].Name, "name_3") 383 t.AssertNE(users[0].UserDetail, nil) 384 t.Assert(users[0].UserDetail.Uid, 3) 385 t.Assert(users[0].UserDetail.Address, "address_3") 386 t.Assert(len(users[0].UserScores), 5) 387 t.Assert(users[0].UserScores[0].Uid, 3) 388 t.Assert(users[0].UserScores[0].Score, 1) 389 t.Assert(users[0].UserScores[4].Uid, 3) 390 t.Assert(users[0].UserScores[4].Score, 5) 391 392 t.Assert(users[1].Id, 4) 393 t.Assert(users[1].Name, "name_4") 394 t.AssertNE(users[1].UserDetail, nil) 395 t.Assert(users[1].UserDetail.Uid, 4) 396 t.Assert(users[1].UserDetail.Address, "address_4") 397 t.Assert(len(users[1].UserScores), 5) 398 t.Assert(users[1].UserScores[0].Uid, 4) 399 t.Assert(users[1].UserScores[0].Score, 1) 400 t.Assert(users[1].UserScores[4].Uid, 4) 401 t.Assert(users[1].UserScores[4].Score, 5) 402 }) 403 gtest.C(t, func(t *gtest.T) { 404 var users []User 405 err := db.With(User{}). 406 With(User{}.UserDetail). 407 With(User{}.UserScores). 408 Where("id", []int{3, 4}). 409 Scan(&users) 410 t.AssertNil(err) 411 t.Assert(len(users), 2) 412 t.Assert(users[0].Id, 3) 413 t.Assert(users[0].Name, "name_3") 414 t.AssertNE(users[0].UserDetail, nil) 415 t.Assert(users[0].UserDetail.Uid, 3) 416 t.Assert(users[0].UserDetail.Address, "address_3") 417 t.Assert(len(users[0].UserScores), 5) 418 t.Assert(users[0].UserScores[0].Uid, 3) 419 t.Assert(users[0].UserScores[0].Score, 1) 420 t.Assert(users[0].UserScores[4].Uid, 3) 421 t.Assert(users[0].UserScores[4].Score, 5) 422 423 t.Assert(users[1].Id, 4) 424 t.Assert(users[1].Name, "name_4") 425 t.AssertNE(users[1].UserDetail, nil) 426 t.Assert(users[1].UserDetail.Uid, 4) 427 t.Assert(users[1].UserDetail.Address, "address_4") 428 t.Assert(len(users[1].UserScores), 5) 429 t.Assert(users[1].UserScores[0].Uid, 4) 430 t.Assert(users[1].UserScores[0].Score, 1) 431 t.Assert(users[1].UserScores[4].Uid, 4) 432 t.Assert(users[1].UserScores[4].Score, 5) 433 }) 434 // With part attribute: UserDetail. 435 gtest.C(t, func(t *gtest.T) { 436 var users []*User 437 err := db.With(User{}). 438 With(User{}.UserDetail). 439 Where("id", []int{3, 4}). 440 Scan(&users) 441 t.AssertNil(err) 442 t.Assert(len(users), 2) 443 t.Assert(users[0].Id, 3) 444 t.Assert(users[0].Name, "name_3") 445 t.AssertNE(users[0].UserDetail, nil) 446 t.Assert(users[0].UserDetail.Uid, 3) 447 t.Assert(users[0].UserDetail.Address, "address_3") 448 t.Assert(len(users[0].UserScores), 0) 449 450 t.Assert(users[1].Id, 4) 451 t.Assert(users[1].Name, "name_4") 452 t.AssertNE(users[1].UserDetail, nil) 453 t.Assert(users[1].UserDetail.Uid, 4) 454 t.Assert(users[1].UserDetail.Address, "address_4") 455 t.Assert(len(users[1].UserScores), 0) 456 }) 457 // With part attribute: UserScores. 458 gtest.C(t, func(t *gtest.T) { 459 var users []*User 460 err := db.With(User{}). 461 With(User{}.UserScores). 462 Where("id", []int{3, 4}). 463 Scan(&users) 464 t.AssertNil(err) 465 t.Assert(len(users), 2) 466 t.Assert(users[0].Id, 3) 467 t.Assert(users[0].Name, "name_3") 468 t.Assert(users[0].UserDetail, nil) 469 t.Assert(len(users[0].UserScores), 5) 470 t.Assert(users[0].UserScores[0].Uid, 3) 471 t.Assert(users[0].UserScores[0].Score, 1) 472 t.Assert(users[0].UserScores[4].Uid, 3) 473 t.Assert(users[0].UserScores[4].Score, 5) 474 475 t.Assert(users[1].Id, 4) 476 t.Assert(users[1].Name, "name_4") 477 t.Assert(users[1].UserDetail, nil) 478 t.Assert(len(users[1].UserScores), 5) 479 t.Assert(users[1].UserScores[0].Uid, 4) 480 t.Assert(users[1].UserScores[0].Score, 1) 481 t.Assert(users[1].UserScores[4].Uid, 4) 482 t.Assert(users[1].UserScores[4].Score, 5) 483 }) 484 } 485 486 func Test_Table_Relation_WithAll(t *testing.T) { 487 var ( 488 tableUser = "user" 489 tableUserDetail = "user_detail" 490 tableUserScores = "user_scores" 491 ) 492 if _, err := db.Exec(fmt.Sprintf(` 493 CREATE TABLE IF NOT EXISTS %s ( 494 id int(10) unsigned NOT NULL AUTO_INCREMENT, 495 name varchar(45) NOT NULL, 496 PRIMARY KEY (id) 497 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 498 `, tableUser)); err != nil { 499 gtest.Error(err) 500 } 501 defer dropTable(tableUser) 502 503 if _, err := db.Exec(fmt.Sprintf(` 504 CREATE TABLE IF NOT EXISTS %s ( 505 uid int(10) unsigned NOT NULL AUTO_INCREMENT, 506 address varchar(45) NOT NULL, 507 PRIMARY KEY (uid) 508 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 509 `, tableUserDetail)); err != nil { 510 gtest.Error(err) 511 } 512 defer dropTable(tableUserDetail) 513 514 if _, err := db.Exec(fmt.Sprintf(` 515 CREATE TABLE IF NOT EXISTS %s ( 516 id int(10) unsigned NOT NULL AUTO_INCREMENT, 517 uid int(10) unsigned NOT NULL, 518 score int(10) unsigned NOT NULL, 519 PRIMARY KEY (id) 520 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 521 `, tableUserScores)); err != nil { 522 gtest.Error(err) 523 } 524 defer dropTable(tableUserScores) 525 526 type UserDetail struct { 527 gmeta.Meta `orm:"table:user_detail"` 528 Uid int `json:"uid"` 529 Address string `json:"address"` 530 } 531 532 type UserScores struct { 533 gmeta.Meta `orm:"table:user_scores"` 534 Id int `json:"id"` 535 Uid int `json:"uid"` 536 Score int `json:"score"` 537 } 538 539 type User struct { 540 gmeta.Meta `orm:"table:user"` 541 Id int `json:"id"` 542 Name string `json:"name"` 543 UserDetail *UserDetail `orm:"with:uid=id"` 544 UserScores []*UserScores `orm:"with:uid=id"` 545 } 546 547 // Initialize the data. 548 var err error 549 for i := 1; i <= 5; i++ { 550 // User. 551 _, err = db.Insert(tableUser, g.Map{ 552 "id": i, 553 "name": fmt.Sprintf(`name_%d`, i), 554 }) 555 gtest.Assert(err, nil) 556 // Detail. 557 _, err = db.Insert(tableUserDetail, g.Map{ 558 "uid": i, 559 "address": fmt.Sprintf(`address_%d`, i), 560 }) 561 gtest.Assert(err, nil) 562 // Scores. 563 for j := 1; j <= 5; j++ { 564 _, err = db.Insert(tableUserScores, g.Map{ 565 "uid": i, 566 "score": j, 567 }) 568 gtest.Assert(err, nil) 569 } 570 } 571 gtest.C(t, func(t *gtest.T) { 572 var user *User 573 err := db.Model(tableUser).WithAll().Where("id", 3).Scan(&user) 574 t.AssertNil(err) 575 t.Assert(user.Id, 3) 576 t.AssertNE(user.UserDetail, nil) 577 t.Assert(user.UserDetail.Uid, 3) 578 t.Assert(user.UserDetail.Address, `address_3`) 579 t.Assert(len(user.UserScores), 5) 580 t.Assert(user.UserScores[0].Uid, 3) 581 t.Assert(user.UserScores[0].Score, 1) 582 t.Assert(user.UserScores[4].Uid, 3) 583 t.Assert(user.UserScores[4].Score, 5) 584 }) 585 gtest.C(t, func(t *gtest.T) { 586 var user User 587 err := db.Model(tableUser).WithAll().Where("id", 4).Scan(&user) 588 t.AssertNil(err) 589 t.Assert(user.Id, 4) 590 t.AssertNE(user.UserDetail, nil) 591 t.Assert(user.UserDetail.Uid, 4) 592 t.Assert(user.UserDetail.Address, `address_4`) 593 t.Assert(len(user.UserScores), 5) 594 t.Assert(user.UserScores[0].Uid, 4) 595 t.Assert(user.UserScores[0].Score, 1) 596 t.Assert(user.UserScores[4].Uid, 4) 597 t.Assert(user.UserScores[4].Score, 5) 598 }) 599 } 600 601 func Test_Table_Relation_WithAll_List(t *testing.T) { 602 var ( 603 tableUser = "user" 604 tableUserDetail = "user_detail" 605 tableUserScores = "user_scores" 606 ) 607 if _, err := db.Exec(fmt.Sprintf(` 608 CREATE TABLE IF NOT EXISTS %s ( 609 id int(10) unsigned NOT NULL AUTO_INCREMENT, 610 name varchar(45) NOT NULL, 611 PRIMARY KEY (id) 612 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 613 `, tableUser)); err != nil { 614 gtest.Error(err) 615 } 616 defer dropTable(tableUser) 617 618 if _, err := db.Exec(fmt.Sprintf(` 619 CREATE TABLE IF NOT EXISTS %s ( 620 uid int(10) unsigned NOT NULL AUTO_INCREMENT, 621 address varchar(45) NOT NULL, 622 PRIMARY KEY (uid) 623 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 624 `, tableUserDetail)); err != nil { 625 gtest.Error(err) 626 } 627 defer dropTable(tableUserDetail) 628 629 if _, err := db.Exec(fmt.Sprintf(` 630 CREATE TABLE IF NOT EXISTS %s ( 631 id int(10) unsigned NOT NULL AUTO_INCREMENT, 632 uid int(10) unsigned NOT NULL, 633 score int(10) unsigned NOT NULL, 634 PRIMARY KEY (id) 635 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 636 `, tableUserScores)); err != nil { 637 gtest.Error(err) 638 } 639 defer dropTable(tableUserScores) 640 641 type UserDetail struct { 642 gmeta.Meta `orm:"table:user_detail"` 643 Uid int `json:"uid"` 644 Address string `json:"address"` 645 } 646 647 type UserScores struct { 648 gmeta.Meta `orm:"table:user_scores"` 649 Id int `json:"id"` 650 Uid int `json:"uid"` 651 Score int `json:"score"` 652 } 653 654 type User struct { 655 gmeta.Meta `orm:"table:user"` 656 Id int `json:"id"` 657 Name string `json:"name"` 658 UserDetail *UserDetail `orm:"with:uid=id"` 659 UserScores []*UserScores `orm:"with:uid=id"` 660 } 661 662 // Initialize the data. 663 var err error 664 for i := 1; i <= 5; i++ { 665 // User. 666 _, err = db.Insert(tableUser, g.Map{ 667 "id": i, 668 "name": fmt.Sprintf(`name_%d`, i), 669 }) 670 gtest.Assert(err, nil) 671 // Detail. 672 _, err = db.Insert(tableUserDetail, g.Map{ 673 "uid": i, 674 "address": fmt.Sprintf(`address_%d`, i), 675 }) 676 gtest.Assert(err, nil) 677 // Scores. 678 for j := 1; j <= 5; j++ { 679 _, err = db.Insert(tableUserScores, g.Map{ 680 "uid": i, 681 "score": j, 682 }) 683 gtest.Assert(err, nil) 684 } 685 } 686 gtest.C(t, func(t *gtest.T) { 687 var users []*User 688 err := db.Model(tableUser).WithAll().Where("id", []int{3, 4}).Scan(&users) 689 t.AssertNil(err) 690 t.Assert(len(users), 2) 691 t.Assert(users[0].Id, 3) 692 t.Assert(users[0].Name, "name_3") 693 t.AssertNE(users[0].UserDetail, nil) 694 t.Assert(users[0].UserDetail.Uid, 3) 695 t.Assert(users[0].UserDetail.Address, "address_3") 696 t.Assert(len(users[0].UserScores), 5) 697 t.Assert(users[0].UserScores[0].Uid, 3) 698 t.Assert(users[0].UserScores[0].Score, 1) 699 t.Assert(users[0].UserScores[4].Uid, 3) 700 t.Assert(users[0].UserScores[4].Score, 5) 701 702 t.Assert(users[1].Id, 4) 703 t.Assert(users[1].Name, "name_4") 704 t.AssertNE(users[1].UserDetail, nil) 705 t.Assert(users[1].UserDetail.Uid, 4) 706 t.Assert(users[1].UserDetail.Address, "address_4") 707 t.Assert(len(users[1].UserScores), 5) 708 t.Assert(users[1].UserScores[0].Uid, 4) 709 t.Assert(users[1].UserScores[0].Score, 1) 710 t.Assert(users[1].UserScores[4].Uid, 4) 711 t.Assert(users[1].UserScores[4].Score, 5) 712 }) 713 gtest.C(t, func(t *gtest.T) { 714 var users []User 715 err := db.Model(tableUser).WithAll().Where("id", []int{3, 4}).Scan(&users) 716 t.AssertNil(err) 717 t.Assert(len(users), 2) 718 t.Assert(users[0].Id, 3) 719 t.Assert(users[0].Name, "name_3") 720 t.AssertNE(users[0].UserDetail, nil) 721 t.Assert(users[0].UserDetail.Uid, 3) 722 t.Assert(users[0].UserDetail.Address, "address_3") 723 t.Assert(len(users[0].UserScores), 5) 724 t.Assert(users[0].UserScores[0].Uid, 3) 725 t.Assert(users[0].UserScores[0].Score, 1) 726 t.Assert(users[0].UserScores[4].Uid, 3) 727 t.Assert(users[0].UserScores[4].Score, 5) 728 729 t.Assert(users[1].Id, 4) 730 t.Assert(users[1].Name, "name_4") 731 t.AssertNE(users[1].UserDetail, nil) 732 t.Assert(users[1].UserDetail.Uid, 4) 733 t.Assert(users[1].UserDetail.Address, "address_4") 734 t.Assert(len(users[1].UserScores), 5) 735 t.Assert(users[1].UserScores[0].Uid, 4) 736 t.Assert(users[1].UserScores[0].Score, 1) 737 t.Assert(users[1].UserScores[4].Uid, 4) 738 t.Assert(users[1].UserScores[4].Score, 5) 739 }) 740 } 741 742 func Test_Table_Relation_WithAllCondition_List(t *testing.T) { 743 var ( 744 tableUser = "user" 745 tableUserDetail = "user_detail" 746 tableUserScores = "user_scores" 747 ) 748 if _, err := db.Exec(fmt.Sprintf(` 749 CREATE TABLE IF NOT EXISTS %s ( 750 id int(10) unsigned NOT NULL AUTO_INCREMENT, 751 name varchar(45) NOT NULL, 752 PRIMARY KEY (id) 753 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 754 `, tableUser)); err != nil { 755 gtest.Error(err) 756 } 757 defer dropTable(tableUser) 758 759 if _, err := db.Exec(fmt.Sprintf(` 760 CREATE TABLE IF NOT EXISTS %s ( 761 uid int(10) unsigned NOT NULL AUTO_INCREMENT, 762 address varchar(45) NOT NULL, 763 PRIMARY KEY (uid) 764 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 765 `, tableUserDetail)); err != nil { 766 gtest.Error(err) 767 } 768 defer dropTable(tableUserDetail) 769 770 if _, err := db.Exec(fmt.Sprintf(` 771 CREATE TABLE IF NOT EXISTS %s ( 772 id int(10) unsigned NOT NULL AUTO_INCREMENT, 773 uid int(10) unsigned NOT NULL, 774 score int(10) unsigned NOT NULL, 775 PRIMARY KEY (id) 776 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 777 `, tableUserScores)); err != nil { 778 gtest.Error(err) 779 } 780 defer dropTable(tableUserScores) 781 782 type UserDetail struct { 783 gmeta.Meta `orm:"table:user_detail"` 784 Uid int `json:"uid"` 785 Address string `json:"address"` 786 } 787 788 type UserScores struct { 789 gmeta.Meta `orm:"table:user_scores"` 790 Id int `json:"id"` 791 Uid int `json:"uid"` 792 Score int `json:"score"` 793 } 794 795 type User struct { 796 gmeta.Meta `orm:"table:user"` 797 Id int `json:"id"` 798 Name string `json:"name"` 799 UserDetail *UserDetail `orm:"with:uid=id, where:uid > 3"` 800 UserScores []*UserScores `orm:"with:uid=id, where:score>1 and score<5, order:score desc"` 801 } 802 803 // Initialize the data. 804 var err error 805 for i := 1; i <= 5; i++ { 806 // User. 807 _, err = db.Insert(tableUser, g.Map{ 808 "id": i, 809 "name": fmt.Sprintf(`name_%d`, i), 810 }) 811 gtest.Assert(err, nil) 812 // Detail. 813 _, err = db.Insert(tableUserDetail, g.Map{ 814 "uid": i, 815 "address": fmt.Sprintf(`address_%d`, i), 816 }) 817 gtest.Assert(err, nil) 818 // Scores. 819 for j := 1; j <= 5; j++ { 820 _, err = db.Insert(tableUserScores, g.Map{ 821 "uid": i, 822 "score": j, 823 }) 824 gtest.Assert(err, nil) 825 } 826 } 827 828 db.SetDebug(true) 829 defer db.SetDebug(false) 830 831 gtest.C(t, func(t *gtest.T) { 832 var users []*User 833 err := db.Model(tableUser).WithAll().Where("id", []int{3, 4}).Scan(&users) 834 t.AssertNil(err) 835 t.Assert(len(users), 2) 836 t.Assert(users[0].Id, 3) 837 t.Assert(users[0].Name, "name_3") 838 t.Assert(users[0].UserDetail, nil) 839 t.Assert(users[1].Id, 4) 840 t.Assert(users[1].Name, "name_4") 841 t.AssertNE(users[1].UserDetail, nil) 842 t.Assert(users[1].UserDetail.Uid, 4) 843 t.Assert(users[1].UserDetail.Address, "address_4") 844 t.Assert(len(users[1].UserScores), 3) 845 t.Assert(users[1].UserScores[0].Uid, 4) 846 t.Assert(users[1].UserScores[0].Score, 4) 847 t.Assert(users[1].UserScores[2].Uid, 4) 848 t.Assert(users[1].UserScores[2].Score, 2) 849 }) 850 gtest.C(t, func(t *gtest.T) { 851 var users []User 852 err := db.Model(tableUser).WithAll().Where("id", []int{3, 4}).Scan(&users) 853 t.AssertNil(err) 854 t.Assert(len(users), 2) 855 t.Assert(users[0].Id, 3) 856 t.Assert(users[0].Name, "name_3") 857 t.Assert(users[0].UserDetail, nil) 858 859 t.Assert(len(users[0].UserScores), 3) 860 t.Assert(users[0].UserScores[0].Uid, 3) 861 t.Assert(users[0].UserScores[0].Score, 4) 862 t.Assert(users[0].UserScores[2].Uid, 3) 863 t.Assert(users[0].UserScores[2].Score, 2) 864 865 t.Assert(users[1].Id, 4) 866 t.Assert(users[1].Name, "name_4") 867 t.AssertNE(users[1].UserDetail, nil) 868 t.Assert(users[1].UserDetail.Uid, 4) 869 t.Assert(users[1].UserDetail.Address, "address_4") 870 t.Assert(len(users[1].UserScores), 3) 871 t.Assert(users[1].UserScores[0].Uid, 4) 872 t.Assert(users[1].UserScores[0].Score, 4) 873 t.Assert(users[1].UserScores[2].Uid, 4) 874 t.Assert(users[1].UserScores[2].Score, 2) 875 }) 876 } 877 878 func Test_Table_Relation_WithAll_Embedded_With_SelfMaintained_Attributes(t *testing.T) { 879 var ( 880 tableUser = "user" 881 tableUserDetail = "user_detail" 882 tableUserScores = "user_scores" 883 ) 884 if _, err := db.Exec(fmt.Sprintf(` 885 CREATE TABLE IF NOT EXISTS %s ( 886 id int(10) unsigned NOT NULL AUTO_INCREMENT, 887 name varchar(45) NOT NULL, 888 PRIMARY KEY (id) 889 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 890 `, tableUser)); err != nil { 891 gtest.Error(err) 892 } 893 defer dropTable(tableUser) 894 895 if _, err := db.Exec(fmt.Sprintf(` 896 CREATE TABLE IF NOT EXISTS %s ( 897 uid int(10) unsigned NOT NULL AUTO_INCREMENT, 898 address varchar(45) NOT NULL, 899 PRIMARY KEY (uid) 900 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 901 `, tableUserDetail)); err != nil { 902 gtest.Error(err) 903 } 904 defer dropTable(tableUserDetail) 905 906 if _, err := db.Exec(fmt.Sprintf(` 907 CREATE TABLE IF NOT EXISTS %s ( 908 id int(10) unsigned NOT NULL AUTO_INCREMENT, 909 uid int(10) unsigned NOT NULL, 910 score int(10) unsigned NOT NULL, 911 PRIMARY KEY (id) 912 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 913 `, tableUserScores)); err != nil { 914 gtest.Error(err) 915 } 916 defer dropTable(tableUserScores) 917 918 type UserDetail struct { 919 gmeta.Meta `orm:"table:user_detail"` 920 Uid int `json:"uid"` 921 Address string `json:"address"` 922 } 923 924 type UserScores struct { 925 gmeta.Meta `orm:"table:user_scores"` 926 Id int `json:"id"` 927 Uid int `json:"uid"` 928 Score int `json:"score"` 929 } 930 931 type User struct { 932 gmeta.Meta `orm:"table:user"` 933 *UserDetail `orm:"with:uid=id"` 934 Id int `json:"id"` 935 Name string `json:"name"` 936 UserScores []*UserScores `orm:"with:uid=id"` 937 } 938 939 // Initialize the data. 940 var err error 941 for i := 1; i <= 5; i++ { 942 // User. 943 _, err = db.Insert(tableUser, g.Map{ 944 "id": i, 945 "name": fmt.Sprintf(`name_%d`, i), 946 }) 947 gtest.Assert(err, nil) 948 // Detail. 949 _, err = db.Insert(tableUserDetail, g.Map{ 950 "uid": i, 951 "address": fmt.Sprintf(`address_%d`, i), 952 }) 953 gtest.Assert(err, nil) 954 // Scores. 955 for j := 1; j <= 5; j++ { 956 _, err = db.Insert(tableUserScores, g.Map{ 957 "uid": i, 958 "score": j, 959 }) 960 gtest.Assert(err, nil) 961 } 962 } 963 gtest.C(t, func(t *gtest.T) { 964 var user *User 965 err := db.Model(tableUser).WithAll().Where("id", 3).Scan(&user) 966 t.AssertNil(err) 967 t.Assert(user.Id, 3) 968 t.AssertNE(user.UserDetail, nil) 969 t.Assert(user.UserDetail.Uid, 3) 970 t.Assert(user.UserDetail.Address, `address_3`) 971 t.Assert(len(user.UserScores), 5) 972 t.Assert(user.UserScores[0].Uid, 3) 973 t.Assert(user.UserScores[0].Score, 1) 974 t.Assert(user.UserScores[4].Uid, 3) 975 t.Assert(user.UserScores[4].Score, 5) 976 }) 977 gtest.C(t, func(t *gtest.T) { 978 var user User 979 err := db.Model(tableUser).WithAll().Where("id", 4).Scan(&user) 980 t.AssertNil(err) 981 t.Assert(user.Id, 4) 982 t.AssertNE(user.UserDetail, nil) 983 t.Assert(user.UserDetail.Uid, 4) 984 t.Assert(user.UserDetail.Address, `address_4`) 985 t.Assert(len(user.UserScores), 5) 986 t.Assert(user.UserScores[0].Uid, 4) 987 t.Assert(user.UserScores[0].Score, 1) 988 t.Assert(user.UserScores[4].Uid, 4) 989 t.Assert(user.UserScores[4].Score, 5) 990 }) 991 } 992 993 func Test_Table_Relation_WithAll_Embedded_Without_SelfMaintained_Attributes(t *testing.T) { 994 var ( 995 tableUser = "user" 996 tableUserDetail = "user_detail" 997 tableUserScores = "user_scores" 998 ) 999 if _, err := db.Exec(fmt.Sprintf(` 1000 CREATE TABLE IF NOT EXISTS %s ( 1001 id int(10) unsigned NOT NULL AUTO_INCREMENT, 1002 name varchar(45) NOT NULL, 1003 PRIMARY KEY (id) 1004 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 1005 `, tableUser)); err != nil { 1006 gtest.Error(err) 1007 } 1008 defer dropTable(tableUser) 1009 1010 if _, err := db.Exec(fmt.Sprintf(` 1011 CREATE TABLE IF NOT EXISTS %s ( 1012 uid int(10) unsigned NOT NULL AUTO_INCREMENT, 1013 address varchar(45) NOT NULL, 1014 PRIMARY KEY (uid) 1015 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 1016 `, tableUserDetail)); err != nil { 1017 gtest.Error(err) 1018 } 1019 defer dropTable(tableUserDetail) 1020 1021 if _, err := db.Exec(fmt.Sprintf(` 1022 CREATE TABLE IF NOT EXISTS %s ( 1023 id int(10) unsigned NOT NULL AUTO_INCREMENT, 1024 uid int(10) unsigned NOT NULL, 1025 score int(10) unsigned NOT NULL, 1026 PRIMARY KEY (id) 1027 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 1028 `, tableUserScores)); err != nil { 1029 gtest.Error(err) 1030 } 1031 defer dropTable(tableUserScores) 1032 1033 type UserDetail struct { 1034 gmeta.Meta `orm:"table:user_detail"` 1035 Uid int `json:"uid"` 1036 Address string `json:"address"` 1037 } 1038 1039 type UserScores struct { 1040 gmeta.Meta `orm:"table:user_scores"` 1041 Id int `json:"id"` 1042 Uid int `json:"uid"` 1043 Score int `json:"score"` 1044 } 1045 1046 // For Test Only 1047 type UserEmbedded struct { 1048 Id int `json:"id"` 1049 Name string `json:"name"` 1050 } 1051 1052 type User struct { 1053 gmeta.Meta `orm:"table:user"` 1054 *UserDetail `orm:"with:uid=id"` 1055 UserEmbedded 1056 UserScores []*UserScores `orm:"with:uid=id"` 1057 } 1058 1059 // Initialize the data. 1060 var err error 1061 for i := 1; i <= 5; i++ { 1062 // User. 1063 _, err = db.Insert(tableUser, g.Map{ 1064 "id": i, 1065 "name": fmt.Sprintf(`name_%d`, i), 1066 }) 1067 gtest.Assert(err, nil) 1068 // Detail. 1069 _, err = db.Insert(tableUserDetail, g.Map{ 1070 "uid": i, 1071 "address": fmt.Sprintf(`address_%d`, i), 1072 }) 1073 gtest.Assert(err, nil) 1074 // Scores. 1075 for j := 1; j <= 5; j++ { 1076 _, err = db.Insert(tableUserScores, g.Map{ 1077 "uid": i, 1078 "score": j, 1079 }) 1080 gtest.Assert(err, nil) 1081 } 1082 } 1083 db.SetDebug(true) 1084 defer db.SetDebug(false) 1085 1086 gtest.C(t, func(t *gtest.T) { 1087 var user *User 1088 err := db.Model(tableUser).WithAll().Where("id", 3).Scan(&user) 1089 t.AssertNil(err) 1090 t.Assert(user.Id, 3) 1091 t.AssertNE(user.UserDetail, nil) 1092 t.Assert(user.UserDetail.Uid, 3) 1093 t.Assert(user.UserDetail.Address, `address_3`) 1094 t.Assert(len(user.UserScores), 5) 1095 t.Assert(user.UserScores[0].Uid, 3) 1096 t.Assert(user.UserScores[0].Score, 1) 1097 t.Assert(user.UserScores[4].Uid, 3) 1098 t.Assert(user.UserScores[4].Score, 5) 1099 }) 1100 gtest.C(t, func(t *gtest.T) { 1101 var user User 1102 err := db.Model(tableUser).WithAll().Where("id", 4).Scan(&user) 1103 t.AssertNil(err) 1104 t.Assert(user.Id, 4) 1105 t.AssertNE(user.UserDetail, nil) 1106 t.Assert(user.UserDetail.Uid, 4) 1107 t.Assert(user.UserDetail.Address, `address_4`) 1108 t.Assert(len(user.UserScores), 5) 1109 t.Assert(user.UserScores[0].Uid, 4) 1110 t.Assert(user.UserScores[0].Score, 1) 1111 t.Assert(user.UserScores[4].Uid, 4) 1112 t.Assert(user.UserScores[4].Score, 5) 1113 }) 1114 } 1115 1116 func Test_Table_Relation_WithAll_Embedded_WithoutMeta(t *testing.T) { 1117 var ( 1118 tableUser = "user" 1119 tableUserDetail = "user_detail" 1120 tableUserScores = "user_scores" 1121 ) 1122 if _, err := db.Exec(fmt.Sprintf(` 1123 CREATE TABLE IF NOT EXISTS %s ( 1124 id int(10) unsigned NOT NULL AUTO_INCREMENT, 1125 name varchar(45) NOT NULL, 1126 PRIMARY KEY (id) 1127 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 1128 `, tableUser)); err != nil { 1129 gtest.Error(err) 1130 } 1131 defer dropTable(tableUser) 1132 1133 if _, err := db.Exec(fmt.Sprintf(` 1134 CREATE TABLE IF NOT EXISTS %s ( 1135 uid int(10) unsigned NOT NULL AUTO_INCREMENT, 1136 address varchar(45) NOT NULL, 1137 PRIMARY KEY (uid) 1138 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 1139 `, tableUserDetail)); err != nil { 1140 gtest.Error(err) 1141 } 1142 defer dropTable(tableUserDetail) 1143 1144 if _, err := db.Exec(fmt.Sprintf(` 1145 CREATE TABLE IF NOT EXISTS %s ( 1146 id int(10) unsigned NOT NULL AUTO_INCREMENT, 1147 uid int(10) unsigned NOT NULL, 1148 score int(10) unsigned NOT NULL, 1149 PRIMARY KEY (id) 1150 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 1151 `, tableUserScores)); err != nil { 1152 gtest.Error(err) 1153 } 1154 defer dropTable(tableUserScores) 1155 1156 type UserDetailBase struct { 1157 Uid int `json:"uid"` 1158 Address string `json:"address"` 1159 } 1160 1161 type UserDetail struct { 1162 UserDetailBase 1163 } 1164 1165 type UserScores struct { 1166 Id int `json:"id"` 1167 Uid int `json:"uid"` 1168 Score int `json:"score"` 1169 } 1170 1171 type User struct { 1172 *UserDetail `orm:"with:uid=id"` 1173 Id int `json:"id"` 1174 Name string `json:"name"` 1175 UserScores []*UserScores `orm:"with:uid=id"` 1176 } 1177 1178 // Initialize the data. 1179 var err error 1180 for i := 1; i <= 5; i++ { 1181 // User. 1182 _, err = db.Insert(tableUser, g.Map{ 1183 "id": i, 1184 "name": fmt.Sprintf(`name_%d`, i), 1185 }) 1186 gtest.Assert(err, nil) 1187 // Detail. 1188 _, err = db.Insert(tableUserDetail, g.Map{ 1189 "uid": i, 1190 "address": fmt.Sprintf(`address_%d`, i), 1191 }) 1192 gtest.Assert(err, nil) 1193 // Scores. 1194 for j := 1; j <= 5; j++ { 1195 _, err = db.Insert(tableUserScores, g.Map{ 1196 "uid": i, 1197 "score": j, 1198 }) 1199 gtest.Assert(err, nil) 1200 } 1201 } 1202 gtest.C(t, func(t *gtest.T) { 1203 var user *User 1204 err := db.Model(tableUser).WithAll().Where("id", 3).Scan(&user) 1205 t.AssertNil(err) 1206 t.Assert(user.Id, 3) 1207 t.AssertNE(user.UserDetail, nil) 1208 t.Assert(user.UserDetail.Uid, 3) 1209 t.Assert(user.UserDetail.Address, `address_3`) 1210 t.Assert(len(user.UserScores), 5) 1211 t.Assert(user.UserScores[0].Uid, 3) 1212 t.Assert(user.UserScores[0].Score, 1) 1213 t.Assert(user.UserScores[4].Uid, 3) 1214 t.Assert(user.UserScores[4].Score, 5) 1215 }) 1216 gtest.C(t, func(t *gtest.T) { 1217 var user User 1218 err := db.Model(tableUser).WithAll().Where("id", 4).Scan(&user) 1219 t.AssertNil(err) 1220 t.Assert(user.Id, 4) 1221 t.AssertNE(user.UserDetail, nil) 1222 t.Assert(user.UserDetail.Uid, 4) 1223 t.Assert(user.UserDetail.Address, `address_4`) 1224 t.Assert(len(user.UserScores), 5) 1225 t.Assert(user.UserScores[0].Uid, 4) 1226 t.Assert(user.UserScores[0].Score, 1) 1227 t.Assert(user.UserScores[4].Uid, 4) 1228 t.Assert(user.UserScores[4].Score, 5) 1229 }) 1230 } 1231 1232 func Test_Table_Relation_WithAll_AttributeStructAlsoHasWithTag(t *testing.T) { 1233 var ( 1234 tableUser = "user" 1235 tableUserDetail = "user_detail" 1236 tableUserScores = "user_scores" 1237 ) 1238 if _, err := db.Exec(fmt.Sprintf(` 1239 CREATE TABLE IF NOT EXISTS %s ( 1240 id int(10) unsigned NOT NULL AUTO_INCREMENT, 1241 name varchar(45) NOT NULL, 1242 PRIMARY KEY (id) 1243 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 1244 `, tableUser)); err != nil { 1245 gtest.Error(err) 1246 } 1247 defer dropTable(tableUser) 1248 1249 if _, err := db.Exec(fmt.Sprintf(` 1250 CREATE TABLE IF NOT EXISTS %s ( 1251 uid int(10) unsigned NOT NULL AUTO_INCREMENT, 1252 address varchar(45) NOT NULL, 1253 PRIMARY KEY (uid) 1254 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 1255 `, tableUserDetail)); err != nil { 1256 gtest.Error(err) 1257 } 1258 defer dropTable(tableUserDetail) 1259 1260 if _, err := db.Exec(fmt.Sprintf(` 1261 CREATE TABLE IF NOT EXISTS %s ( 1262 id int(10) unsigned NOT NULL AUTO_INCREMENT, 1263 uid int(10) unsigned NOT NULL, 1264 score int(10) unsigned NOT NULL, 1265 PRIMARY KEY (id) 1266 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 1267 `, tableUserScores)); err != nil { 1268 gtest.Error(err) 1269 } 1270 defer dropTable(tableUserScores) 1271 1272 type UserScores struct { 1273 gmeta.Meta `orm:"table:user_scores"` 1274 Id int `json:"id"` 1275 Uid int `json:"uid"` 1276 Score int `json:"score"` 1277 } 1278 1279 type UserDetail struct { 1280 gmeta.Meta `orm:"table:user_detail"` 1281 Uid int `json:"uid"` 1282 Address string `json:"address"` 1283 UserScores []*UserScores `orm:"with:uid"` 1284 } 1285 1286 type User struct { 1287 gmeta.Meta `orm:"table:user"` 1288 *UserDetail `orm:"with:uid=id"` 1289 Id int `json:"id"` 1290 Name string `json:"name"` 1291 } 1292 1293 // Initialize the data. 1294 var err error 1295 for i := 1; i <= 5; i++ { 1296 // User. 1297 _, err = db.Insert(tableUser, g.Map{ 1298 "id": i, 1299 "name": fmt.Sprintf(`name_%d`, i), 1300 }) 1301 gtest.Assert(err, nil) 1302 // Detail. 1303 _, err = db.Insert(tableUserDetail, g.Map{ 1304 "uid": i, 1305 "address": fmt.Sprintf(`address_%d`, i), 1306 }) 1307 gtest.Assert(err, nil) 1308 // Scores. 1309 for j := 1; j <= 5; j++ { 1310 _, err = db.Insert(tableUserScores, g.Map{ 1311 "uid": i, 1312 "score": j, 1313 }) 1314 gtest.Assert(err, nil) 1315 } 1316 } 1317 1318 gtest.C(t, func(t *gtest.T) { 1319 var user *User 1320 err := db.Model(tableUser).WithAll().Where("id", 3).Scan(&user) 1321 t.AssertNil(err) 1322 t.Assert(user.Id, 3) 1323 t.AssertNE(user.UserDetail, nil) 1324 t.Assert(user.UserDetail.Uid, 3) 1325 t.Assert(user.UserDetail.Address, `address_3`) 1326 t.Assert(len(user.UserDetail.UserScores), 5) 1327 t.Assert(user.UserDetail.UserScores[0].Uid, 3) 1328 t.Assert(user.UserDetail.UserScores[0].Score, 1) 1329 t.Assert(user.UserDetail.UserScores[4].Uid, 3) 1330 t.Assert(user.UserDetail.UserScores[4].Score, 5) 1331 }) 1332 gtest.C(t, func(t *gtest.T) { 1333 var user User 1334 err := db.Model(tableUser).WithAll().Where("id", 4).Scan(&user) 1335 t.AssertNil(err) 1336 t.Assert(user.Id, 4) 1337 t.AssertNE(user.UserDetail, nil) 1338 t.Assert(user.UserDetail.Uid, 4) 1339 t.Assert(user.UserDetail.Address, `address_4`) 1340 t.Assert(len(user.UserDetail.UserScores), 5) 1341 t.Assert(user.UserDetail.UserScores[0].Uid, 4) 1342 t.Assert(user.UserDetail.UserScores[0].Score, 1) 1343 t.Assert(user.UserDetail.UserScores[4].Uid, 4) 1344 t.Assert(user.UserDetail.UserScores[4].Score, 5) 1345 }) 1346 } 1347 1348 func Test_Table_Relation_WithAll_AttributeStructAlsoHasWithTag_MoreDeep(t *testing.T) { 1349 var ( 1350 tableUser = "user" 1351 tableUserDetail = "user_detail" 1352 tableUserScores = "user_scores" 1353 ) 1354 if _, err := db.Exec(fmt.Sprintf(` 1355 CREATE TABLE IF NOT EXISTS %s ( 1356 id int(10) unsigned NOT NULL AUTO_INCREMENT, 1357 name varchar(45) NOT NULL, 1358 PRIMARY KEY (id) 1359 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 1360 `, tableUser)); err != nil { 1361 gtest.Error(err) 1362 } 1363 defer dropTable(tableUser) 1364 1365 if _, err := db.Exec(fmt.Sprintf(` 1366 CREATE TABLE IF NOT EXISTS %s ( 1367 uid int(10) unsigned NOT NULL AUTO_INCREMENT, 1368 address varchar(45) NOT NULL, 1369 PRIMARY KEY (uid) 1370 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 1371 `, tableUserDetail)); err != nil { 1372 gtest.Error(err) 1373 } 1374 defer dropTable(tableUserDetail) 1375 1376 if _, err := db.Exec(fmt.Sprintf(` 1377 CREATE TABLE IF NOT EXISTS %s ( 1378 id int(10) unsigned NOT NULL AUTO_INCREMENT, 1379 uid int(10) unsigned NOT NULL, 1380 score int(10) unsigned NOT NULL, 1381 PRIMARY KEY (id) 1382 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 1383 `, tableUserScores)); err != nil { 1384 gtest.Error(err) 1385 } 1386 defer dropTable(tableUserScores) 1387 1388 type UserScores struct { 1389 gmeta.Meta `orm:"table:user_scores"` 1390 Id int `json:"id"` 1391 Uid int `json:"uid"` 1392 Score int `json:"score"` 1393 } 1394 1395 type UserDetail1 struct { 1396 gmeta.Meta `orm:"table:user_detail"` 1397 Uid int `json:"uid"` 1398 Address string `json:"address"` 1399 UserScores []*UserScores `orm:"with:uid"` 1400 } 1401 1402 type UserDetail2 struct { 1403 gmeta.Meta `orm:"table:user_detail"` 1404 Uid int `json:"uid"` 1405 Address string `json:"address"` 1406 UserDetail1 *UserDetail1 `orm:"with:uid"` 1407 UserScores []*UserScores `orm:"with:uid"` 1408 } 1409 1410 type UserDetail3 struct { 1411 gmeta.Meta `orm:"table:user_detail"` 1412 Uid int `json:"uid"` 1413 Address string `json:"address"` 1414 UserDetail2 *UserDetail2 `orm:"with:uid"` 1415 UserScores []*UserScores `orm:"with:uid"` 1416 } 1417 1418 type UserDetail struct { 1419 gmeta.Meta `orm:"table:user_detail"` 1420 Uid int `json:"uid"` 1421 Address string `json:"address"` 1422 UserDetail3 *UserDetail3 `orm:"with:uid"` 1423 UserScores []*UserScores `orm:"with:uid"` 1424 } 1425 1426 type User struct { 1427 gmeta.Meta `orm:"table:user"` 1428 *UserDetail `orm:"with:uid=id"` 1429 Id int `json:"id"` 1430 Name string `json:"name"` 1431 } 1432 1433 // Initialize the data. 1434 var err error 1435 for i := 1; i <= 5; i++ { 1436 // User. 1437 _, err = db.Insert(tableUser, g.Map{ 1438 "id": i, 1439 "name": fmt.Sprintf(`name_%d`, i), 1440 }) 1441 gtest.Assert(err, nil) 1442 // Detail. 1443 _, err = db.Insert(tableUserDetail, g.Map{ 1444 "uid": i, 1445 "address": fmt.Sprintf(`address_%d`, i), 1446 }) 1447 gtest.Assert(err, nil) 1448 // Scores. 1449 for j := 1; j <= 5; j++ { 1450 _, err = db.Insert(tableUserScores, g.Map{ 1451 "uid": i, 1452 "score": j, 1453 }) 1454 gtest.Assert(err, nil) 1455 } 1456 } 1457 1458 gtest.C(t, func(t *gtest.T) { 1459 var user *User 1460 err := db.Model(tableUser).WithAll().Where("id", 3).Scan(&user) 1461 t.AssertNil(err) 1462 t.Assert(user.Id, 3) 1463 t.AssertNE(user.UserDetail, nil) 1464 t.Assert(user.UserDetail.Uid, 3) 1465 t.Assert(user.UserDetail.UserDetail3.Uid, 3) 1466 t.Assert(user.UserDetail.UserDetail3.UserDetail2.Uid, 3) 1467 t.Assert(user.UserDetail.UserDetail3.UserDetail2.UserDetail1.Uid, 3) 1468 t.Assert(user.UserDetail.Address, `address_3`) 1469 t.Assert(len(user.UserDetail.UserScores), 5) 1470 t.Assert(user.UserDetail.UserScores[0].Uid, 3) 1471 t.Assert(user.UserDetail.UserScores[0].Score, 1) 1472 t.Assert(user.UserDetail.UserScores[4].Uid, 3) 1473 t.Assert(user.UserDetail.UserScores[4].Score, 5) 1474 }) 1475 gtest.C(t, func(t *gtest.T) { 1476 var user User 1477 err := db.Model(tableUser).WithAll().Where("id", 4).Scan(&user) 1478 t.AssertNil(err) 1479 t.Assert(user.Id, 4) 1480 t.AssertNE(user.UserDetail, nil) 1481 t.Assert(user.UserDetail.Uid, 4) 1482 t.Assert(user.UserDetail.UserDetail3.Uid, 4) 1483 t.Assert(user.UserDetail.UserDetail3.UserDetail2.Uid, 4) 1484 t.Assert(user.UserDetail.UserDetail3.UserDetail2.UserDetail1.Uid, 4) 1485 t.Assert(user.UserDetail.Address, `address_4`) 1486 t.Assert(len(user.UserDetail.UserScores), 5) 1487 t.Assert(user.UserDetail.UserScores[0].Uid, 4) 1488 t.Assert(user.UserDetail.UserScores[0].Score, 1) 1489 t.Assert(user.UserDetail.UserScores[4].Uid, 4) 1490 t.Assert(user.UserDetail.UserScores[4].Score, 5) 1491 }) 1492 } 1493 1494 func Test_Table_Relation_With_AttributeStructAlsoHasWithTag_MoreDeep(t *testing.T) { 1495 var ( 1496 tableUser = "user" 1497 tableUserDetail = "user_detail" 1498 tableUserScores = "user_scores" 1499 ) 1500 if _, err := db.Exec(fmt.Sprintf(` 1501 CREATE TABLE IF NOT EXISTS %s ( 1502 id int(10) unsigned NOT NULL AUTO_INCREMENT, 1503 name varchar(45) NOT NULL, 1504 PRIMARY KEY (id) 1505 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 1506 `, tableUser)); err != nil { 1507 gtest.Error(err) 1508 } 1509 defer dropTable(tableUser) 1510 1511 if _, err := db.Exec(fmt.Sprintf(` 1512 CREATE TABLE IF NOT EXISTS %s ( 1513 uid int(10) unsigned NOT NULL AUTO_INCREMENT, 1514 address varchar(45) NOT NULL, 1515 PRIMARY KEY (uid) 1516 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 1517 `, tableUserDetail)); err != nil { 1518 gtest.Error(err) 1519 } 1520 defer dropTable(tableUserDetail) 1521 1522 if _, err := db.Exec(fmt.Sprintf(` 1523 CREATE TABLE IF NOT EXISTS %s ( 1524 id int(10) unsigned NOT NULL AUTO_INCREMENT, 1525 uid int(10) unsigned NOT NULL, 1526 score int(10) unsigned NOT NULL, 1527 PRIMARY KEY (id) 1528 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 1529 `, tableUserScores)); err != nil { 1530 gtest.Error(err) 1531 } 1532 defer dropTable(tableUserScores) 1533 1534 type UserScores struct { 1535 gmeta.Meta `orm:"table:user_scores"` 1536 Id int `json:"id"` 1537 Uid int `json:"uid"` 1538 Score int `json:"score"` 1539 } 1540 1541 type UserDetail1 struct { 1542 gmeta.Meta `orm:"table:user_detail"` 1543 Uid int `json:"uid"` 1544 Address string `json:"address"` 1545 UserScores []*UserScores `orm:"with:uid"` 1546 } 1547 1548 type UserDetail2 struct { 1549 gmeta.Meta `orm:"table:user_detail"` 1550 Uid int `json:"uid"` 1551 Address string `json:"address"` 1552 UserDetail1 *UserDetail1 `orm:"with:uid"` 1553 UserScores []*UserScores `orm:"with:uid"` 1554 } 1555 1556 type UserDetail3 struct { 1557 gmeta.Meta `orm:"table:user_detail"` 1558 Uid int `json:"uid"` 1559 Address string `json:"address"` 1560 UserDetail2 *UserDetail2 `orm:"with:uid"` 1561 UserScores []*UserScores `orm:"with:uid"` 1562 } 1563 1564 type UserDetail struct { 1565 gmeta.Meta `orm:"table:user_detail"` 1566 Uid int `json:"uid"` 1567 Address string `json:"address"` 1568 UserDetail3 *UserDetail3 `orm:"with:uid"` 1569 UserScores []*UserScores `orm:"with:uid"` 1570 } 1571 1572 type User struct { 1573 gmeta.Meta `orm:"table:user"` 1574 *UserDetail `orm:"with:uid=id"` 1575 Id int `json:"id"` 1576 Name string `json:"name"` 1577 } 1578 1579 // Initialize the data. 1580 var err error 1581 for i := 1; i <= 5; i++ { 1582 // User. 1583 _, err = db.Insert(tableUser, g.Map{ 1584 "id": i, 1585 "name": fmt.Sprintf(`name_%d`, i), 1586 }) 1587 gtest.Assert(err, nil) 1588 // Detail. 1589 _, err = db.Insert(tableUserDetail, g.Map{ 1590 "uid": i, 1591 "address": fmt.Sprintf(`address_%d`, i), 1592 }) 1593 gtest.Assert(err, nil) 1594 // Scores. 1595 for j := 1; j <= 5; j++ { 1596 _, err = db.Insert(tableUserScores, g.Map{ 1597 "uid": i, 1598 "score": j, 1599 }) 1600 gtest.Assert(err, nil) 1601 } 1602 } 1603 1604 gtest.C(t, func(t *gtest.T) { 1605 var user *User 1606 err := db.Model(tableUser).With(UserDetail{}, UserDetail2{}, UserDetail3{}, UserScores{}).Where("id", 3).Scan(&user) 1607 t.AssertNil(err) 1608 t.Assert(user.Id, 3) 1609 t.AssertNE(user.UserDetail, nil) 1610 t.Assert(user.UserDetail.Uid, 3) 1611 t.Assert(user.UserDetail.UserDetail3.Uid, 3) 1612 t.Assert(user.UserDetail.UserDetail3.UserDetail2.Uid, 3) 1613 t.Assert(user.UserDetail.UserDetail3.UserDetail2.UserDetail1, nil) 1614 t.Assert(user.UserDetail.Address, `address_3`) 1615 t.Assert(len(user.UserDetail.UserScores), 5) 1616 t.Assert(user.UserDetail.UserScores[0].Uid, 3) 1617 t.Assert(user.UserDetail.UserScores[0].Score, 1) 1618 t.Assert(user.UserDetail.UserScores[4].Uid, 3) 1619 t.Assert(user.UserDetail.UserScores[4].Score, 5) 1620 }) 1621 gtest.C(t, func(t *gtest.T) { 1622 var user User 1623 err := db.Model(tableUser).With(UserDetail{}, UserDetail2{}, UserDetail3{}, UserScores{}).Where("id", 4).Scan(&user) 1624 t.AssertNil(err) 1625 t.Assert(user.Id, 4) 1626 t.AssertNE(user.UserDetail, nil) 1627 t.Assert(user.UserDetail.Uid, 4) 1628 t.Assert(user.UserDetail.UserDetail3.Uid, 4) 1629 t.Assert(user.UserDetail.UserDetail3.UserDetail2.Uid, 4) 1630 t.Assert(user.UserDetail.UserDetail3.UserDetail2.UserDetail1, nil) 1631 t.Assert(user.UserDetail.Address, `address_4`) 1632 t.Assert(len(user.UserDetail.UserScores), 5) 1633 t.Assert(user.UserDetail.UserScores[0].Uid, 4) 1634 t.Assert(user.UserDetail.UserScores[0].Score, 1) 1635 t.Assert(user.UserDetail.UserScores[4].Uid, 4) 1636 t.Assert(user.UserDetail.UserScores[4].Score, 5) 1637 }) 1638 } 1639 1640 func Test_Table_Relation_With_MultipleDepends1(t *testing.T) { 1641 defer func() { 1642 dropTable("table_a") 1643 dropTable("table_b") 1644 dropTable("table_c") 1645 }() 1646 for _, v := range gstr.SplitAndTrim(gfile.GetContents(gdebug.TestDataPath("with_multiple_depends.sql")), ";") { 1647 if _, err := db.Exec(v); err != nil { 1648 gtest.Error(err) 1649 } 1650 } 1651 1652 type TableC struct { 1653 gmeta.Meta `orm:"table_c"` 1654 Id int `orm:"id,primary" json:"id"` 1655 TableBId int `orm:"table_b_id" json:"table_b_id"` 1656 } 1657 1658 type TableB struct { 1659 gmeta.Meta `orm:"table_b"` 1660 Id int `orm:"id,primary" json:"id"` 1661 TableAId int `orm:"table_a_id" json:"table_a_id"` 1662 TableC *TableC `orm:"with:table_b_id=id" json:"table_c"` 1663 } 1664 1665 type TableA struct { 1666 gmeta.Meta `orm:"table_a"` 1667 Id int `orm:"id,primary" json:"id"` 1668 TableB *TableB `orm:"with:table_a_id=id" json:"table_b"` 1669 } 1670 1671 db.SetDebug(true) 1672 defer db.SetDebug(false) 1673 1674 // Struct. 1675 gtest.C(t, func(t *gtest.T) { 1676 var tableA *TableA 1677 err := db.Model("table_a").WithAll().Scan(&tableA) 1678 //g.Dump(tableA) 1679 t.AssertNil(err) 1680 t.AssertNE(tableA, nil) 1681 t.Assert(tableA.Id, 1) 1682 1683 t.AssertNE(tableA.TableB, nil) 1684 t.AssertNE(tableA.TableB.TableC, nil) 1685 t.Assert(tableA.TableB.TableAId, 1) 1686 t.Assert(tableA.TableB.TableC.Id, 100) 1687 t.Assert(tableA.TableB.TableC.TableBId, 10) 1688 }) 1689 1690 // Structs 1691 gtest.C(t, func(t *gtest.T) { 1692 var tableA []*TableA 1693 err := db.Model("table_a").WithAll().OrderAsc("id").Scan(&tableA) 1694 //g.Dump(tableA) 1695 t.AssertNil(err) 1696 t.Assert(len(tableA), 2) 1697 t.AssertNE(tableA[0].TableB, nil) 1698 t.AssertNE(tableA[1].TableB, nil) 1699 t.AssertNE(tableA[0].TableB.TableC, nil) 1700 t.AssertNE(tableA[1].TableB.TableC, nil) 1701 1702 t.Assert(tableA[0].Id, 1) 1703 t.Assert(tableA[0].TableB.Id, 10) 1704 t.Assert(tableA[0].TableB.TableC.Id, 100) 1705 1706 t.Assert(tableA[1].Id, 2) 1707 t.Assert(tableA[1].TableB.Id, 20) 1708 t.Assert(tableA[1].TableB.TableC.Id, 300) 1709 }) 1710 } 1711 1712 func Test_Table_Relation_With_MultipleDepends2(t *testing.T) { 1713 defer func() { 1714 dropTable("table_a") 1715 dropTable("table_b") 1716 dropTable("table_c") 1717 }() 1718 for _, v := range gstr.SplitAndTrim(gfile.GetContents(gdebug.TestDataPath("with_multiple_depends.sql")), ";") { 1719 if _, err := db.Exec(v); err != nil { 1720 gtest.Error(err) 1721 } 1722 } 1723 1724 type TableC struct { 1725 gmeta.Meta `orm:"table_c"` 1726 Id int `orm:"id,primary" json:"id"` 1727 TableBId int `orm:"table_b_id" json:"table_b_id"` 1728 } 1729 1730 type TableB struct { 1731 gmeta.Meta `orm:"table_b"` 1732 Id int `orm:"id,primary" json:"id"` 1733 TableAId int `orm:"table_a_id" json:"table_a_id"` 1734 TableC []*TableC `orm:"with:table_b_id=id" json:"table_c"` 1735 } 1736 1737 type TableA struct { 1738 gmeta.Meta `orm:"table_a"` 1739 Id int `orm:"id,primary" json:"id"` 1740 TableB []*TableB `orm:"with:table_a_id=id" json:"table_b"` 1741 } 1742 1743 db.SetDebug(true) 1744 defer db.SetDebug(false) 1745 1746 // Struct. 1747 gtest.C(t, func(t *gtest.T) { 1748 var tableA *TableA 1749 err := db.Model("table_a").WithAll().Scan(&tableA) 1750 //g.Dump(tableA) 1751 t.AssertNil(err) 1752 t.AssertNE(tableA, nil) 1753 t.Assert(tableA.Id, 1) 1754 1755 t.Assert(len(tableA.TableB), 2) 1756 t.Assert(tableA.TableB[0].Id, 10) 1757 t.Assert(tableA.TableB[1].Id, 30) 1758 1759 t.Assert(len(tableA.TableB[0].TableC), 2) 1760 t.Assert(len(tableA.TableB[1].TableC), 1) 1761 t.Assert(tableA.TableB[0].TableC[0].Id, 100) 1762 t.Assert(tableA.TableB[0].TableC[0].TableBId, 10) 1763 t.Assert(tableA.TableB[0].TableC[1].Id, 200) 1764 t.Assert(tableA.TableB[0].TableC[1].TableBId, 10) 1765 t.Assert(tableA.TableB[1].TableC[0].Id, 400) 1766 t.Assert(tableA.TableB[1].TableC[0].TableBId, 30) 1767 }) 1768 1769 // Structs 1770 gtest.C(t, func(t *gtest.T) { 1771 var tableA []*TableA 1772 err := db.Model("table_a").WithAll().OrderAsc("id").Scan(&tableA) 1773 //g.Dump(tableA) 1774 t.AssertNil(err) 1775 t.Assert(len(tableA), 2) 1776 1777 t.Assert(len(tableA[0].TableB), 2) 1778 t.Assert(tableA[0].TableB[0].Id, 10) 1779 t.Assert(tableA[0].TableB[1].Id, 30) 1780 1781 t.Assert(len(tableA[0].TableB[0].TableC), 2) 1782 t.Assert(len(tableA[0].TableB[1].TableC), 1) 1783 t.Assert(tableA[0].TableB[0].TableC[0].Id, 100) 1784 t.Assert(tableA[0].TableB[0].TableC[0].TableBId, 10) 1785 t.Assert(tableA[0].TableB[0].TableC[1].Id, 200) 1786 t.Assert(tableA[0].TableB[0].TableC[1].TableBId, 10) 1787 t.Assert(tableA[0].TableB[1].TableC[0].Id, 400) 1788 t.Assert(tableA[0].TableB[1].TableC[0].TableBId, 30) 1789 1790 t.Assert(tableA[1].TableB[0].TableC[0].Id, 300) 1791 t.Assert(tableA[1].TableB[0].TableC[0].TableBId, 20) 1792 1793 t.Assert(tableA[1].TableB[1].Id, 40) 1794 t.Assert(tableA[1].TableB[1].TableAId, 2) 1795 t.Assert(tableA[1].TableB[1].TableC, nil) 1796 }) 1797 } 1798 1799 func Test_Table_Relation_With_MultipleDepends_Embedded(t *testing.T) { 1800 defer func() { 1801 dropTable("table_a") 1802 dropTable("table_b") 1803 dropTable("table_c") 1804 }() 1805 for _, v := range gstr.SplitAndTrim(gfile.GetContents(gdebug.TestDataPath("with_multiple_depends.sql")), ";") { 1806 if _, err := db.Exec(v); err != nil { 1807 gtest.Error(err) 1808 } 1809 } 1810 1811 type TableC struct { 1812 gmeta.Meta `orm:"table_c"` 1813 Id int `orm:"id,primary" json:"id"` 1814 TableBId int `orm:"table_b_id" json:"table_b_id"` 1815 } 1816 1817 type TableB struct { 1818 gmeta.Meta `orm:"table_b"` 1819 Id int `orm:"id,primary" json:"id"` 1820 TableAId int `orm:"table_a_id" json:"table_a_id"` 1821 *TableC `orm:"with:table_b_id=id" json:"table_c"` 1822 } 1823 1824 type TableA struct { 1825 gmeta.Meta `orm:"table_a"` 1826 Id int `orm:"id,primary" json:"id"` 1827 *TableB `orm:"with:table_a_id=id" json:"table_b"` 1828 } 1829 1830 db.SetDebug(true) 1831 defer db.SetDebug(false) 1832 1833 // Struct. 1834 gtest.C(t, func(t *gtest.T) { 1835 var tableA *TableA 1836 err := db.Model("table_a").WithAll().Scan(&tableA) 1837 //g.Dump(tableA) 1838 t.AssertNil(err) 1839 t.AssertNE(tableA, nil) 1840 t.Assert(tableA.Id, 1) 1841 1842 t.AssertNE(tableA.TableB, nil) 1843 t.AssertNE(tableA.TableB.TableC, nil) 1844 t.Assert(tableA.TableB.TableAId, 1) 1845 t.Assert(tableA.TableB.TableC.Id, 100) 1846 t.Assert(tableA.TableB.TableC.TableBId, 10) 1847 }) 1848 1849 // Structs 1850 gtest.C(t, func(t *gtest.T) { 1851 var tableA []*TableA 1852 err := db.Model("table_a").WithAll().OrderAsc("id").Scan(&tableA) 1853 //g.Dump(tableA) 1854 t.AssertNil(err) 1855 t.Assert(len(tableA), 2) 1856 t.AssertNE(tableA[0].TableB, nil) 1857 t.AssertNE(tableA[1].TableB, nil) 1858 t.AssertNE(tableA[0].TableB.TableC, nil) 1859 t.AssertNE(tableA[1].TableB.TableC, nil) 1860 1861 t.Assert(tableA[0].Id, 1) 1862 t.Assert(tableA[0].TableB.Id, 10) 1863 t.Assert(tableA[0].TableB.TableC.Id, 100) 1864 1865 t.Assert(tableA[1].Id, 2) 1866 t.Assert(tableA[1].TableB.Id, 20) 1867 t.Assert(tableA[1].TableB.TableC.Id, 300) 1868 }) 1869 } 1870 1871 func Test_Table_Relation_WithAll_Embedded_Meta_NameMatchingRule(t *testing.T) { 1872 var ( 1873 tableUser = "user1" 1874 tableUserDetail = "user_detail1" 1875 tableUserScores = "user_scores1" 1876 ) 1877 if _, err := db.Exec(fmt.Sprintf(` 1878 CREATE TABLE IF NOT EXISTS %s ( 1879 id int(10) unsigned NOT NULL AUTO_INCREMENT, 1880 name varchar(45) NOT NULL, 1881 PRIMARY KEY (id) 1882 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 1883 `, tableUser)); err != nil { 1884 gtest.Error(err) 1885 } 1886 defer dropTable(tableUser) 1887 1888 if _, err := db.Exec(fmt.Sprintf(` 1889 CREATE TABLE IF NOT EXISTS %s ( 1890 user_id int(10) unsigned NOT NULL, 1891 address varchar(45) NOT NULL, 1892 PRIMARY KEY (user_id) 1893 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 1894 `, tableUserDetail)); err != nil { 1895 gtest.Error(err) 1896 } 1897 defer dropTable(tableUserDetail) 1898 1899 if _, err := db.Exec(fmt.Sprintf(` 1900 CREATE TABLE IF NOT EXISTS %s ( 1901 id int(10) unsigned NOT NULL AUTO_INCREMENT, 1902 user_id int(10) unsigned NOT NULL, 1903 score int(10) unsigned NOT NULL, 1904 PRIMARY KEY (id) 1905 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 1906 `, tableUserScores)); err != nil { 1907 gtest.Error(err) 1908 } 1909 defer dropTable(tableUserScores) 1910 1911 type UserDetail struct { 1912 gmeta.Meta `orm:"table:user_detail1"` 1913 UserID int `json:"user_id"` 1914 Address string `json:"address"` 1915 } 1916 1917 type UserScores struct { 1918 gmeta.Meta `orm:"table:user_scores1"` 1919 ID int `json:"id"` 1920 UserID int `json:"user_id"` 1921 Score int `json:"score"` 1922 } 1923 1924 // For Test Only 1925 type UserEmbedded struct { 1926 ID int `json:"id"` 1927 Name string `json:"name"` 1928 } 1929 1930 type User struct { 1931 gmeta.Meta `orm:"table:user1"` 1932 UserEmbedded 1933 UserDetail UserDetail `orm:"with:user_id=id"` 1934 UserScores []*UserScores `orm:"with:user_id=id"` 1935 } 1936 1937 // Initialize the data. 1938 var err error 1939 for i := 1; i <= 5; i++ { 1940 // User. 1941 _, err = db.Insert(tableUser, g.Map{ 1942 "id": i, 1943 "name": fmt.Sprintf(`name_%d`, i), 1944 }) 1945 gtest.AssertNil(err) 1946 // Detail. 1947 _, err = db.Insert(tableUserDetail, g.Map{ 1948 "user_id": i, 1949 "address": fmt.Sprintf(`address_%d`, i), 1950 }) 1951 gtest.AssertNil(err) 1952 // Scores. 1953 for j := 1; j <= 5; j++ { 1954 _, err = db.Insert(tableUserScores, g.Map{ 1955 "user_id": i, 1956 "score": j, 1957 }) 1958 gtest.AssertNil(err) 1959 } 1960 } 1961 1962 db.SetDebug(true) 1963 defer db.SetDebug(false) 1964 1965 gtest.C(t, func(t *gtest.T) { 1966 var user *User 1967 err := db.Model(tableUser).WithAll().Where("id", 3).Scan(&user) 1968 t.AssertNil(err) 1969 t.Assert(user.ID, 3) 1970 t.AssertNE(user.UserDetail, nil) 1971 t.Assert(user.UserDetail.UserID, 3) 1972 t.Assert(user.UserDetail.Address, `address_3`) 1973 t.Assert(len(user.UserScores), 5) 1974 t.Assert(user.UserScores[0].UserID, 3) 1975 t.Assert(user.UserScores[0].Score, 1) 1976 t.Assert(user.UserScores[4].UserID, 3) 1977 t.Assert(user.UserScores[4].Score, 5) 1978 }) 1979 gtest.C(t, func(t *gtest.T) { 1980 var user User 1981 err := db.Model(tableUser).WithAll().Where("id", 4).Scan(&user) 1982 t.AssertNil(err) 1983 t.Assert(user.ID, 4) 1984 t.AssertNE(user.UserDetail, nil) 1985 t.Assert(user.UserDetail.UserID, 4) 1986 t.Assert(user.UserDetail.Address, `address_4`) 1987 t.Assert(len(user.UserScores), 5) 1988 t.Assert(user.UserScores[0].UserID, 4) 1989 t.Assert(user.UserScores[0].Score, 1) 1990 t.Assert(user.UserScores[4].UserID, 4) 1991 t.Assert(user.UserScores[4].Score, 5) 1992 }) 1993 }