Merge pull request #90 from xdmnl/master

Fix ORDER BY "id" is ambiguous
This commit is contained in:
Jinzhu 2014-04-11 16:19:46 +08:00
commit 65137121ff
2 changed files with 23 additions and 11 deletions

View File

@ -131,13 +131,13 @@ func (s *DB) Assign(attrs ...interface{}) *DB {
func (s *DB) First(out interface{}, where ...interface{}) *DB {
scope := s.clone().NewScope(out)
scope.Search = scope.Search.clone().order(scope.PrimaryKey()).limit(1)
scope.Search = scope.Search.clone().order(scope.TableName()+"."+scope.PrimaryKey()).limit(1)
return scope.inlineCondition(where...).callCallbacks(s.parent.callback.queries).db
}
func (s *DB) Last(out interface{}, where ...interface{}) *DB {
scope := s.clone().NewScope(out)
scope.Search = scope.Search.clone().order(scope.PrimaryKey() + " DESC").limit(1)
scope.Search = scope.Search.clone().order(scope.TableName()+"."+scope.PrimaryKey() + " DESC").limit(1)
return scope.inlineCondition(where...).callCallbacks(s.parent.callback.queries).db
}

View File

@ -237,7 +237,7 @@ func TestFirstAndLast(t *testing.T) {
db.Last(&user3)
db.Order("id desc").Find(&user4)
if user1.Id != user2.Id || user3.Id != user4.Id {
t.Errorf("First and Last should works correctly")
t.Errorf("First and Last should work correctly")
}
var users []User
@ -247,6 +247,18 @@ func TestFirstAndLast(t *testing.T) {
}
}
func TestFirstAndLastWithJoins(t *testing.T) {
var user1, user2, user3, user4 User
db.Joins("left join emails on emails.user_id = users.id").First(&user1)
db.Order("id").Find(&user2)
db.Joins("left join emails on emails.user_id = users.id").Last(&user3)
db.Order("id desc").Find(&user4)
if user1.Id != user2.Id || user3.Id != user4.Id {
t.Errorf("First and Last should work correctly with Joins")
}
}
func TestFirstAndLastForTableWithNoStdPrimaryKey(t *testing.T) {
var animal1, animal2, animal3, animal4 Animal
db.First(&animal1)
@ -255,7 +267,7 @@ func TestFirstAndLastForTableWithNoStdPrimaryKey(t *testing.T) {
db.Last(&animal3)
db.Order("counter desc").Find(&animal4)
if animal1.Counter != animal2.Counter || animal3.Counter != animal4.Counter {
t.Errorf("First and Last should works correctly")
t.Errorf("First and Last should work correctly")
}
var animals []Animal
@ -619,7 +631,7 @@ func TestOrderAndPluck(t *testing.T) {
db.Model(&User{}).Order("age desc").Pluck("age", &ages3).Order("age", true).Pluck("age", &ages4)
if reflect.DeepEqual(ages3, ages4) {
t.Errorf("Reorder should works")
t.Errorf("Reorder should work")
}
var names []string
@ -636,7 +648,7 @@ func TestLimit(t *testing.T) {
db.Order("age desc").Limit(3).Find(&users1).Limit(5).Find(&users2).Limit(-1).Find(&users3)
if len(users1) != 3 || len(users2) != 5 || len(users3) <= 5 {
t.Errorf("Limit should works")
t.Errorf("Limit should work")
}
}
@ -645,7 +657,7 @@ func TestOffset(t *testing.T) {
db.Limit(100).Order("age desc").Find(&users1).Offset(3).Find(&users2).Offset(5).Find(&users3).Offset(-1).Find(&users4)
if (len(users1) != len(users4)) || (len(users1)-len(users2) != 3) || (len(users1)-len(users3) != 5) {
t.Errorf("Offset should works")
t.Errorf("Offset should work")
}
}
@ -662,7 +674,7 @@ func TestCount(t *testing.T) {
var users []User
if err := db.Where("name = ?", "1").Or("name = ?", "3").Find(&users).Count(&count).Error; err != nil {
t.Errorf("Count should works", err)
t.Errorf("Count should work", err)
}
if count != int64(len(users)) {
@ -671,7 +683,7 @@ func TestCount(t *testing.T) {
db.Model(&User{}).Where("name = ?", "1").Count(&count1).Or("name = ?", "3").Count(&count2)
if count1 != 1 || count2 != 3 {
t.Errorf("Multiple count should works")
t.Errorf("Multiple count should work")
}
}
@ -789,7 +801,7 @@ func TestRunCallbacks(t *testing.T) {
var products []Product
db.Find(&products, "code = ?", "unique_code")
if products[0].AfterFindCallTimes != 2 {
t.Errorf("AfterFind callbacks should works with slice")
t.Errorf("AfterFind callbacks should work with slice")
}
db.Where("Code = ?", "unique_code").First(&p)
@ -1753,7 +1765,7 @@ func TestScan(t *testing.T) {
var res result
db.Table("users").Select("name, age").Where("name = ?", 3).Scan(&res)
if res.Name != "3" {
t.Errorf("Scan into struct should works")
t.Errorf("Scan into struct should work")
}
var ress []result