Di bawah ini adalah penangan api saya. Saat pertama kali dijalankan, ini memberi saya output yang benar dan panggilan yang sesuai di db juga benar.

2020-07-04 14:51:04.512 IST [32129] postgres@postgres LOG:  execute <unnamed>: SELECT count(*) FROM "access_owners"  WHERE ("access_owners"."area" = $1)
2020-07-04 14:51:04.512 IST [32129] postgres@postgres DETAIL:  parameters: $1 = '4th Floor'
2020-07-04 14:51:04.513 IST [32129] postgres@postgres LOG:  execute <unnamed>: SELECT * FROM "access_owners"  WHERE ("access_owners"."area" = $1) LIMIT 10 OFFSET 2
2020-07-04 14:51:04.513 IST [32129] postgres@postgres DETAIL:  parameters: $1 = '4th Floor'

Ini adalah respons API yang saya dapatkan

{
    "skip": 2,
    "limit": 10,
    "total": 3,
    "resources": [
        {
            "id": 26,
            "name": "Test_User_5",
            "email": "test_user_5@gmailcom",
            "area": "4th Floor"
        }
    ]
}

Tetapi jika saya memanggil API yang sama lagi dengan parameter yang sama, kesalahan menambahkan satu lagi kondisi di DB.

2020-07-04 14:51:22.560 IST [32129] postgres@postgres LOG:  execute <unnamed>: SELECT count(*) FROM "access_owners"  WHERE ("access_owners"."area" = $1) AND ("access_owners"."area" = $2) LIMIT 10 OFFSET 2
2020-07-04 14:51:22.560 IST [32129] postgres@postgres DETAIL:  parameters: $1 = '4th Floor', $2 = '4th Floor'

Dan ini kesalahan yang saya dapatkan

sql: no rows in result set

Ini adalah penangan API saya

func GetAccessOwners(db *gorm.DB) echo.HandlerFunc {
    return func(c echo.Context) error {
        page := new(models.ResourcePage)
        var ao = new(models.AccessOwner)
        var err error
        if err = c.Bind(ao); err != nil {
            return err
        }
        var skip int
        var limit int
        skipParam := c.QueryParam("skip")
        limitParam := c.QueryParam("limit")
        if strings.TrimSpace(skipParam) != "" {
            skip, err = strconv.Atoi(skipParam)
            if err != nil {
                return merry.Wrap(err)
            }
        } else {
            skip = 0
        }

        if strings.TrimSpace(limitParam) != "" {
            limit, err = strconv.Atoi(limitParam)
            if err != nil {
                return merry.Wrap(err)
            }
        } else {
            limit = 10
        }
        accessOwners := []models.AccessOwner{}
        page.Resources = []models.AccessOwner{}
        page.Skip = skip
        page.Limit = limit
        

        db = db.Scopes(GetCount(*ao)).Model(page.Resources).Count(&page.Total)
        db = db.Offset(skip)
        db = db.Limit(limit)
        if err := db.Find(&accessOwners).Error; err != nil {
            return merry.Wrap(err)
        }

        page.Resources = accessOwners
        return c.JSON(201, page)

    }
}

func GetCount(ao models.AccessOwner) func(db *gorm.DB) *gorm.DB {
    return func(db *gorm.DB) *gorm.DB {
        return db.Where(ao)
    }
1
puneet 4 Juli 2020, 12:41

1 menjawab

Jawaban Terbaik

Dari dok

Saat menggunakan beberapa metode langsung dengan GORM, metode segera nanti akan digunakan kembali sebelum kondisi kueri metode langsung

Anda menyetel db itu sebabnya di permintaan permintaan kedua kondisi permintaan pertama sudah ada di db.

db = db.Scopes(GetCount(*ao)).Model(page.Resources).Count(&page.Total)
db = db.Offset(skip)
db = db.Limit(limit)

Jadi, jangan atur db, Anda dapat melakukan beberapa operasi rantai atau menggunakannya secara terpisah

db.Scopes(GetCount(*ao)).Model(page.Resources).Count(&page.Total)
                   .Offset(skip).Limit(limit).Find(&accessOwners)
1
Eklavya 4 Juli 2020, 14:49