| 656 | } |
| 657 | |
| 658 | func TestGenericsNestedPreloads(t *testing.T) { |
| 659 | user := *GetUser("generics_nested_preload", Config{Pets: 2}) |
| 660 | user.Friends = []*User{GetUser("generics_nested_preload", Config{Pets: 5})} |
| 661 | |
| 662 | ctx := context.Background() |
| 663 | db := gorm.G[User](DB) |
| 664 | |
| 665 | for idx, pet := range user.Pets { |
| 666 | pet.Toy = Toy{Name: "toy_nested_preload_" + strconv.Itoa(idx+1)} |
| 667 | } |
| 668 | |
| 669 | if err := db.Create(ctx, &user); err != nil { |
| 670 | t.Fatalf("errors happened when create: %v", err) |
| 671 | } |
| 672 | |
| 673 | user2, err := db.Preload("Pets.Toy", nil).Preload("Friends.Pets", func(db gorm.PreloadBuilder) error { |
| 674 | return nil |
| 675 | }).Where(user.ID).Take(ctx) |
| 676 | if err != nil { |
| 677 | t.Errorf("failed to nested preload user") |
| 678 | } |
| 679 | CheckUser(t, user2, user) |
| 680 | if len(user.Pets) == 0 || len(user.Friends) == 0 || len(user.Friends[0].Pets) == 0 { |
| 681 | t.Fatalf("failed to nested preload") |
| 682 | } |
| 683 | |
| 684 | if DB.Dialector.Name() == "mysql" { |
| 685 | // mysql 5.7 doesn't support row_number() |
| 686 | if strings.HasPrefix(DB.Dialector.(*mysql.Dialector).ServerVersion, "5.7") { |
| 687 | return |
| 688 | } |
| 689 | } |
| 690 | if DB.Dialector.Name() == "sqlserver" { |
| 691 | // sqlserver doesn't support order by in subquery |
| 692 | return |
| 693 | } |
| 694 | |
| 695 | user3, err := db.Preload("Pets.Toy", nil).Preload("Friends.Pets", func(db gorm.PreloadBuilder) error { |
| 696 | db.LimitPerRecord(3) |
| 697 | return nil |
| 698 | }).Where(user.ID).Take(ctx) |
| 699 | if err != nil { |
| 700 | t.Errorf("failed to nested preload user") |
| 701 | } |
| 702 | CheckUser(t, user3, user) |
| 703 | |
| 704 | if len(user3.Friends) != 1 || len(user3.Friends[0].Pets) != 3 { |
| 705 | t.Errorf("failed to nested preload with limit per record") |
| 706 | } |
| 707 | } |
| 708 | |
| 709 | func TestGenericsDistinct(t *testing.T) { |
| 710 | ctx := context.Background() |