diff --git a/main.go b/main.go index 942880b5..c98ca2b6 100644 --- a/main.go +++ b/main.go @@ -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 } diff --git a/main_test.go b/main_test.go index 2434c8ef..e4016407 100644 --- a/main_test.go +++ b/main_test.go @@ -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