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

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:

Hàm
Mục đích

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

  1. Không viết query trực tiếp ở controller. → Đặt ở service hoặc repo layer.

  2. 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.

  3. 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