Dao
🔍 1. DAO trong GoFrame là gì?
Trong GoFrame, DAO là lớp trung gian chịu trách nhiệm truy xuất dữ liệu từ database. Nó giúp tách biệt logic truy vấn dữ liệu với các phần còn lại của ứng dụng như service hoặc controller.
GoFrame hỗ trợ tự động tạo mã DAO thông qua gf gen dao
, giúp bạn tiết kiệm thời gian viết code truy vấn CRUD.
📦 2. Cấu trúc thư mục khi dùng DAO
Sau khi generate, bạn thường sẽ thấy thư mục sau:
/internal
├── dao/
│ └── user.go // Lớp truy cập dữ liệu cho bảng user
├── model/
│ ├── entity/ // Struct ánh xạ với bảng CSDL
│ │ └── user.go
│ └── do/ // Struct để truy vấn có điều kiện
│ └── user.go
⚙️ 3. Tạo DAO tự động với gf gen dao
gf gen dao
gf gen dao
Lệnh này sẽ generate tự động:
DAO struct cho mỗi bảng trong thư mục
internal/dao
Entity struct trong
internal/model/entity
Do struct (data object for query) trong
internal/model/do
Ví dụ, bảng user
trong MySQL sẽ tạo:
dao.User
entity.User
do.User
🧱 4. Sử dụng DAO trong Service Layer
Ví dụ thực tế khi query danh sách user:
import (
"context"
"github.com/gogf/gf/v2/frame/g"
"your_project/internal/dao"
"your_project/internal/model/entity"
)
func GetUserList(ctx context.Context) ([]*entity.User, error) {
var users []*entity.User
err := dao.User.Ctx(ctx).Where("status", 1).OrderDesc("created_at").Scan(&users)
return users, err
}
⚡ Một số hàm phổ biến:
Ctx(ctx)
Gán context
Where(...)
Điều kiện
Scan(&result)
Gán kết quả vào struct
All()
Lấy toàn bộ
One()
Lấy 1 record
Count()
Đếm số lượng
✅ 5. Ví dụ CRUD đầy đủ
Thêm user:
input := do.User{
Name: "Tài Titans",
Email: "tai@example.com",
}
_, err := dao.User.Ctx(ctx).Data(input).Insert()
Cập nhật user:
_, err := dao.User.Ctx(ctx).Data(g.Map{
"name": "Tài Update",
}).Where("id", 1).Update()
Xóa user:
_, err := dao.User.Ctx(ctx).Where("id", 1).Delete()
🚨 6. Lưu ý khi dùng DAO trong GoFrame
Không viết query trực tiếp ở controller. → Đặt ở service hoặc repo layer.
Không nên custom code vào file auto-generate → Nếu cần thêm logic DAO riêng thì tạo file riêng, ví dụ
user_extra_dao.go
.Sử dụng
Ctx(ctx)
xuyên suốt để hỗ trợ transaction, trace, logging, etc.
🧪 7. Tích hợp với Transaction
err := g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error {
_, err := dao.User.Ctx(ctx).TX(tx).Data(do.User{Name: "Test"}).Insert()
if err != nil {
return err
}
// Có thể gọi dao khác, miễn cùng `ctx`
return nil
})
Last updated