Fix Association Count
This commit is contained in:
parent
ee48d6986c
commit
801a271d07
@ -297,13 +297,16 @@ func (association *Association) Clear() *Association {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (association *Association) Count() int {
|
func (association *Association) Count() int {
|
||||||
count := -1
|
var (
|
||||||
relationship := association.Field.Relationship
|
count = 0
|
||||||
scope := association.Scope
|
relationship = association.Field.Relationship
|
||||||
newScope := scope.New(association.Field.Field.Interface())
|
scope = association.Scope
|
||||||
|
fieldValue = association.Field.Field.Interface()
|
||||||
|
newScope = scope.New(fieldValue)
|
||||||
|
)
|
||||||
|
|
||||||
if relationship.Kind == "many_to_many" {
|
if relationship.Kind == "many_to_many" {
|
||||||
relationship.JoinTableHandler.JoinWith(relationship.JoinTableHandler, scope.NewDB(), association.Scope.Value).Table(newScope.TableName()).Count(&count)
|
relationship.JoinTableHandler.JoinWith(relationship.JoinTableHandler, scope.NewDB(), association.Scope.Value).Model(fieldValue).Count(&count)
|
||||||
} else if relationship.Kind == "has_many" || relationship.Kind == "has_one" {
|
} else if relationship.Kind == "has_many" || relationship.Kind == "has_one" {
|
||||||
query := scope.DB()
|
query := scope.DB()
|
||||||
for idx, foreignKey := range relationship.ForeignDBNames {
|
for idx, foreignKey := range relationship.ForeignDBNames {
|
||||||
@ -316,16 +319,16 @@ func (association *Association) Count() int {
|
|||||||
if relationship.PolymorphicType != "" {
|
if relationship.PolymorphicType != "" {
|
||||||
query = query.Where(fmt.Sprintf("%v.%v = ?", newScope.QuotedTableName(), newScope.Quote(relationship.PolymorphicDBName)), scope.TableName())
|
query = query.Where(fmt.Sprintf("%v.%v = ?", newScope.QuotedTableName(), newScope.Quote(relationship.PolymorphicDBName)), scope.TableName())
|
||||||
}
|
}
|
||||||
query.Table(newScope.TableName()).Count(&count)
|
query.Model(fieldValue).Count(&count)
|
||||||
} else if relationship.Kind == "belongs_to" {
|
} else if relationship.Kind == "belongs_to" {
|
||||||
query := scope.DB()
|
query := scope.DB()
|
||||||
for idx, foreignKey := range relationship.ForeignDBNames {
|
for idx, primaryKey := range relationship.AssociationForeignDBNames {
|
||||||
if field, ok := scope.FieldByName(relationship.AssociationForeignDBNames[idx]); ok {
|
if field, ok := scope.FieldByName(relationship.ForeignDBNames[idx]); ok {
|
||||||
query = query.Where(fmt.Sprintf("%v.%v = ?", newScope.QuotedTableName(), scope.Quote(foreignKey)),
|
query = query.Where(fmt.Sprintf("%v.%v = ?", newScope.QuotedTableName(), scope.Quote(primaryKey)),
|
||||||
field.Field.Interface())
|
field.Field.Interface())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
query.Table(newScope.TableName()).Count(&count)
|
query.Model(fieldValue).Count(&count)
|
||||||
}
|
}
|
||||||
|
|
||||||
return count
|
return count
|
||||||
|
@ -19,7 +19,7 @@ func TestBelongsTo(t *testing.T) {
|
|||||||
t.Errorf("Got errors when save post", err.Error())
|
t.Errorf("Got errors when save post", err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
if post.Category.Id == 0 || post.MainCategory.Id == 0 {
|
if post.Category.ID == 0 || post.MainCategory.ID == 0 {
|
||||||
t.Errorf("Category's primary key should be updated")
|
t.Errorf("Category's primary key should be updated")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -46,11 +46,11 @@ func TestBelongsTo(t *testing.T) {
|
|||||||
t.Errorf("Query belongs to relations with Related")
|
t.Errorf("Query belongs to relations with Related")
|
||||||
}
|
}
|
||||||
|
|
||||||
if DB.Model(&post).Association("Category").Count() == 1 {
|
if DB.Model(&post).Association("Category").Count() != 1 {
|
||||||
t.Errorf("Post's category count should be 1")
|
t.Errorf("Post's category count should be 1")
|
||||||
}
|
}
|
||||||
|
|
||||||
if DB.Model(&post).Association("MainCategory").Count() == 1 {
|
if DB.Model(&post).Association("MainCategory").Count() != 1 {
|
||||||
t.Errorf("Post's main category count should be 1")
|
t.Errorf("Post's main category count should be 1")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -60,7 +60,7 @@ func TestBelongsTo(t *testing.T) {
|
|||||||
}
|
}
|
||||||
DB.Model(&post).Association("Category").Append(&category2)
|
DB.Model(&post).Association("Category").Append(&category2)
|
||||||
|
|
||||||
if category2.Id == 0 {
|
if category2.ID == 0 {
|
||||||
t.Errorf("Category should has ID when created with Append")
|
t.Errorf("Category should has ID when created with Append")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -71,7 +71,7 @@ func TestBelongsTo(t *testing.T) {
|
|||||||
t.Errorf("Category should be updated with Append")
|
t.Errorf("Category should be updated with Append")
|
||||||
}
|
}
|
||||||
|
|
||||||
if DB.Model(&post).Association("Category").Count() == 1 {
|
if DB.Model(&post).Association("Category").Count() != 1 {
|
||||||
t.Errorf("Post's category count should be 1")
|
t.Errorf("Post's category count should be 1")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -81,7 +81,7 @@ func TestBelongsTo(t *testing.T) {
|
|||||||
}
|
}
|
||||||
DB.Model(&post).Association("Category").Replace(&category3)
|
DB.Model(&post).Association("Category").Replace(&category3)
|
||||||
|
|
||||||
if category3.Id == 0 {
|
if category3.ID == 0 {
|
||||||
t.Errorf("Category should has ID when created with Replace")
|
t.Errorf("Category should has ID when created with Replace")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -91,7 +91,7 @@ func TestBelongsTo(t *testing.T) {
|
|||||||
t.Errorf("Category should be updated with Replace")
|
t.Errorf("Category should be updated with Replace")
|
||||||
}
|
}
|
||||||
|
|
||||||
if DB.Model(&post).Association("Category").Count() == 1 {
|
if DB.Model(&post).Association("Category").Count() != 1 {
|
||||||
t.Errorf("Post's category count should be 1")
|
t.Errorf("Post's category count should be 1")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -117,8 +117,8 @@ func TestBelongsTo(t *testing.T) {
|
|||||||
t.Errorf("Category should be deleted with Delete")
|
t.Errorf("Category should be deleted with Delete")
|
||||||
}
|
}
|
||||||
|
|
||||||
if DB.Model(&post).Association("Category").Count() == 0 {
|
if count := DB.Model(&post).Association("Category").Count(); count != 0 {
|
||||||
t.Errorf("Post's category count should be 0 after Delete")
|
t.Errorf("Post's category count should be 0 after Delete, but got %v", count)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clear
|
// Clear
|
||||||
@ -144,8 +144,36 @@ func TestBelongsTo(t *testing.T) {
|
|||||||
t.Errorf("Should not find any category after Clear")
|
t.Errorf("Should not find any category after Clear")
|
||||||
}
|
}
|
||||||
|
|
||||||
if DB.Model(&post).Association("Category").Count() == 0 {
|
if count := DB.Model(&post).Association("Category").Count(); count != 0 {
|
||||||
t.Errorf("Post's category count should be 0 after Clear")
|
t.Errorf("Post's category count should be 0 after Clear, but got %v", count)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check Association mode with soft delete
|
||||||
|
category6 := Category{
|
||||||
|
Name: "Category 6",
|
||||||
|
}
|
||||||
|
DB.Model(&post).Association("Category").Append(&category6)
|
||||||
|
|
||||||
|
if count := DB.Model(&post).Association("Category").Count(); count != 1 {
|
||||||
|
t.Errorf("Post's category count should be 1 after Append, but got %v", count)
|
||||||
|
}
|
||||||
|
|
||||||
|
DB.Delete(&category6)
|
||||||
|
|
||||||
|
if count := DB.Model(&post).Association("Category").Count(); count != 0 {
|
||||||
|
t.Errorf("Post's category count should be 0 after the category has been deleted, but got %v", count)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := DB.Model(&post).Association("Category").Find(&Category{}).Error; err == nil {
|
||||||
|
t.Errorf("Post's category is not findable after Delete")
|
||||||
|
}
|
||||||
|
|
||||||
|
if count := DB.Unscoped().Model(&post).Association("Category").Count(); count != 1 {
|
||||||
|
t.Errorf("Post's category count should be 1 when query with Unscoped, but got %v", count)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := DB.Unscoped().Model(&post).Association("Category").Find(&Category{}).Error; err != nil {
|
||||||
|
t.Errorf("Post's category should be findable when query with Unscoped, got %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -39,7 +39,7 @@ func (*PersonAddress) Delete(handler gorm.JoinTableHandlerInterface, db *gorm.DB
|
|||||||
|
|
||||||
func (pa *PersonAddress) JoinWith(handler gorm.JoinTableHandlerInterface, db *gorm.DB, source interface{}) *gorm.DB {
|
func (pa *PersonAddress) JoinWith(handler gorm.JoinTableHandlerInterface, db *gorm.DB, source interface{}) *gorm.DB {
|
||||||
table := pa.Table(db)
|
table := pa.Table(db)
|
||||||
return db.Table(table).Joins("INNER JOIN person_addresses ON person_addresses.address_id = addresses.id").Where(fmt.Sprintf("%v.deleted_at IS NULL OR %v.deleted_at <= '0001-01-02'", table, table))
|
return db.Joins("INNER JOIN person_addresses ON person_addresses.address_id = addresses.id").Where(fmt.Sprintf("%v.deleted_at IS NULL OR %v.deleted_at <= '0001-01-02'", table, table))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestJoinTable(t *testing.T) {
|
func TestJoinTable(t *testing.T) {
|
||||||
|
@ -33,8 +33,9 @@ func init() {
|
|||||||
|
|
||||||
// DB.SetLogger(Logger{log.New(os.Stdout, "\r\n", 0)})
|
// DB.SetLogger(Logger{log.New(os.Stdout, "\r\n", 0)})
|
||||||
// DB.SetLogger(log.New(os.Stdout, "\r\n", 0))
|
// DB.SetLogger(log.New(os.Stdout, "\r\n", 0))
|
||||||
// DB.LogMode(true)
|
if os.Getenv("DEBUG") == "true" {
|
||||||
DB.LogMode(false)
|
DB.LogMode(true)
|
||||||
|
}
|
||||||
|
|
||||||
DB.DB().SetMaxIdleConns(10)
|
DB.DB().SetMaxIdleConns(10)
|
||||||
|
|
||||||
|
@ -6,6 +6,8 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/jinzhu/gorm"
|
||||||
|
|
||||||
"reflect"
|
"reflect"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
@ -154,12 +156,12 @@ type Post struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type Category struct {
|
type Category struct {
|
||||||
Id int64
|
gorm.Model
|
||||||
Name string
|
Name string
|
||||||
}
|
}
|
||||||
|
|
||||||
type Comment struct {
|
type Comment struct {
|
||||||
Id int64
|
gorm.Model
|
||||||
PostId int64
|
PostId int64
|
||||||
Content string
|
Content string
|
||||||
Post Post
|
Post Post
|
||||||
|
Loading…
x
Reference in New Issue
Block a user