序言:
我们在初次学习goLand是可能会遇到查询数据分页,在分页过程会计算查询出来的条数。这个过程会用到dao.db.Find
和 dao.db.Model,那么他们之间到底啥关系要怎么使用呢?
目录
一、dao.db.Find
二、dao.db.Model
三、运用
说明
四、总结:
一、dao.db.Find
在 GORM 中,dao.db.Find
和 dao.db.Model
有不同的用途和上下文,理解它们的区别对于有效使用 GORM 非常重要。
-
用途:用于直接查询并返回结果集。
-
上下文:适用于已经有了模型类型的上下文,通常在查询所有记录或符合某个条件的记录时使用。
例如:
var users []User
err := dao.db.Find(&users).Error
这行代码会查询 User
表中的所有记录,并将结果填充到 users
切片中。
二、dao.db.Model
-
用途:用于创建查询的上下文,通常与链式查询结合使用,尤其是需要在查询中使用条件(例如
Count
、Select
、Where
等)时。 -
上下文:可以在
Model
中指定一个模型,并在此基础上进行进一步的查询操作,比如获取总记录数或应用条件。
例如 :
var total int64
err := dao.db.Model(&User{}).Count(&total).Error
三、运用
使用三层架构编码方式controller层、service层和dao层需要进行分页请求示例:
3.1 dao层中调用:
在 UserDAO
中添加 page
和 pageSize
参数,并在查询时应用这些参数。
// GetAllUsers 获取所有用户,支持分页
func (dao *UserDAO) GetAllUsers(page, pageSize int) ([]entity.User, int64, error) {
var users []entity.User
var total int64
// 先获取总记录数
if err := dao.db.Model(&entity.User{}).Count(&total).Error; err != nil {
log.Printf("Failed to count users: %v", err)
return nil, 0, err
}
// 使用 GORM 查询用户,应用分页
if err := dao.db.Offset((page - 1) * pageSize).Limit(pageSize).Find(&users).Error; err != nil {
log.Printf("Failed to get users: %v", err)
return nil, 0, err
}
return users, total, nil
}
说明
-
参数:
-
GetAllUsers
现在接受两个参数:page
和pageSize
,用于控制分页。
-
-
获取总记录数:
- 在查询用户之前,使用
Count
方法获取用户的总数,以便后续的分页响应中使用。
- 在查询用户之前,使用
-
应用分页:
- 使用
Offset
和Limit
方法进行分页查询,计算出要跳过的记录数和每页的大小。
- 使用
3.2 Service 层中调用
func (s *UserService) GetUsers(page, pageSize int) ([]entity.User, int64, error) {
return s.dao.GetAllUsers(page, pageSize)
}
3.3Controller 层中调用
func getUsers(c *gin.Context) {
reqPage := pagination.NewReqPage(c)
users, total, err := userService.GetUsers(reqPage.Page, reqPage.PageSize)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to get users"})
return
}
paginatedResponse := pagination.NewPage(reqPage.Page, reqPage.PageSize, total, users)
c.JSON(http.StatusOK, paginatedResponse)
}
这样就完成了在三层架构中对分页请求的支持。
四、总结:
-
Find
:直接用于查询并返回结果集,通常是一次性操作。 -
Model
:用于构建更复杂的查询,可以用于链式调用,比如计算、条件查询等。
通常会先使用 Model
来设置查询的上下文,然后使用 Find
、Count
、Where
等方法来构建和执行查询。这样可以保持代码的清晰和可读性。