| 107 | } |
| 108 | |
| 109 | func TestPreloadWithConds(t *testing.T) { |
| 110 | users := []User{ |
| 111 | *GetUser("slice_nested_preload_1", Config{Account: true}), |
| 112 | *GetUser("slice_nested_preload_2", Config{Account: false}), |
| 113 | *GetUser("slice_nested_preload_3", Config{Account: true}), |
| 114 | } |
| 115 | |
| 116 | if err := DB.Create(&users).Error; err != nil { |
| 117 | t.Fatalf("errors happened when create: %v", err) |
| 118 | } |
| 119 | |
| 120 | var userIDs []uint |
| 121 | for _, user := range users { |
| 122 | userIDs = append(userIDs, user.ID) |
| 123 | } |
| 124 | |
| 125 | var users2 []User |
| 126 | DB.Preload("Account", clause.Eq{Column: "number", Value: users[0].Account.Number}).Find(&users2, "id IN ?", userIDs) |
| 127 | sort.Slice(users2, func(i, j int) bool { |
| 128 | return users2[i].ID < users2[j].ID |
| 129 | }) |
| 130 | |
| 131 | for idx, user := range users2[1:2] { |
| 132 | if user.Account.Number != "" { |
| 133 | t.Errorf("No account should found for user %v but got %v", idx+2, user.Account.Number) |
| 134 | } |
| 135 | } |
| 136 | |
| 137 | CheckUser(t, users2[0], users[0]) |
| 138 | |
| 139 | var users3 []User |
| 140 | if err := DB.Preload("Account", func(tx *gorm.DB) *gorm.DB { |
| 141 | return tx.Table("accounts AS a").Select("a.*") |
| 142 | }).Find(&users3, "id IN ?", userIDs).Error; err != nil { |
| 143 | t.Errorf("failed to query, got error %v", err) |
| 144 | } |
| 145 | sort.Slice(users3, func(i, j int) bool { |
| 146 | return users2[i].ID < users2[j].ID |
| 147 | }) |
| 148 | |
| 149 | for i, u := range users3 { |
| 150 | CheckUser(t, u, users[i]) |
| 151 | } |
| 152 | |
| 153 | var user4 User |
| 154 | DB.Delete(&users3[0].Account) |
| 155 | |
| 156 | if err := DB.Preload(clause.Associations).Take(&user4, "id = ?", users3[0].ID).Error; err != nil || user4.Account.ID != 0 { |
| 157 | t.Errorf("failed to query, got error %v, account: %#v", err, user4.Account) |
| 158 | } |
| 159 | |
| 160 | if err := DB.Preload(clause.Associations, func(tx *gorm.DB) *gorm.DB { |
| 161 | return tx.Unscoped() |
| 162 | }).Take(&user4, "id = ?", users3[0].ID).Error; err != nil || user4.Account.ID == 0 { |
| 163 | t.Errorf("failed to query, got error %v, account: %#v", err, user4.Account) |
| 164 | } |
| 165 | } |
| 166 | |