官方给出的model的相关模板只涉及一些简单的操作,如果需要对表做一些复杂的查询,则需要对方法进行自定义,下面给出自定义的步骤,官方生成的一共有3个文件,分别是
- *model.go
- *model_gen.go
- vars.go
第二个文件中包含着生成的一些简单的方法,这个文件是不可以修改的,我们需要修改的是第一个文件
go
package users
import (
"context"
"fmt"
"github.com/zeromicro/go-zero/core/stores/sqlc"
"github.com/zeromicro/go-zero/core/stores/sqlx"
)
var _ UsersModel = (*customUsersModel)(nil)
type (
// UsersModel is an interface to be customized, add more methods here,
// and implement the added methods in customUsersModel.
UsersModel interface {
usersModel
}
customUsersModel struct {
*defaultUsersModel
}
)
// NewUsersModel returns a model for the database table.
func NewUsersModel(conn sqlx.SqlConn) UsersModel {
return &customUsersModel{
defaultUsersModel: newUsersModel(conn),
}
} 这个文件是原本的文件,根据提示我们知道我们需要在UsersModel接口之中添加接口,这个接口里面原本就有一个匿名接口usersModel,这个接口存在于之前那个生成的文件里面,这个接口已经被defaultUsersModel实现,既然我们的这个UsersModel也包含了这个接口,所以我们也包含它其中的方法
再可以看到这个下面有一个定义的customUsersModel,里面包含了defaultUsersModel,也就是上面提到的实现usersModel的结构体,customUsersModel包含了它,所以说相当于customUsersModel也实现了defaultUsersModel
然而,根据NewUsersModel可以知道,我们返回的是UserModel这个接口,所以说,我们需要对这个接口添加方法,然后使用customUsersModel实现它
根据上述的逻辑,我们可以这样添加方法,然后实现它
go
package users
import (
"context"
"fmt"
"github.com/zeromicro/go-zero/core/stores/sqlc"
"github.com/zeromicro/go-zero/core/stores/sqlx"
)
var _ UsersModel = (*customUsersModel)(nil)
type (
// UsersModel is an interface to be customized, add more methods here,
// and implement the added methods in customUsersModel.
UsersModel interface {
usersModel
Login(ctx context.Context, email, password string) (*Users, error)
}
customUsersModel struct {
*defaultUsersModel
}
)
func (m *customUsersModel) Login(ctx context.Context, email, password string) (*Users, error) {
query := fmt.Sprintf("select %s from %s where `email` = ? and `password` = ? limit 1", usersRows, m.table)
var resp Users
err := m.conn.QueryRowCtx(ctx, &resp, query, email, password)
switch err {
case nil:
return &resp, nil
case sqlc.ErrNotFound:
return nil, ErrNotFound
default:
return nil, err
}
}
// NewUsersModel returns a model for the database table.
func NewUsersModel(conn sqlx.SqlConn) UsersModel {
return &customUsersModel{
defaultUsersModel: newUsersModel(conn),
}
}