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  }