账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    beego的表关系怎么设置
    69
    0

    用户User
    用户定单Order

    想要实现
    一个用户可以有N个订单,每个定单只能有一个用户

    模型

    type User struct {
        Id    int64
        Name    string
        Order    []*Order    `orm:"reverse(many)"`
    }
    
    type Order struct {
        Id    int64
        User    *User    `orm:"rel(fk)"`
        CreatedAt    time.Time
    }

    数据表:
    user

    id name
    1 test
    2 testbbbb

    order

    id user_id(外键) created_at
    1 1 2018-12-20 10:36:47
    2 1 2018-12-20 10:38:09
    3 1 2018-12-20 10:40:12
    4 2 2018-12-20 10:47:52

    按照上面设置
    获取定单数据:

    {
        "Id":1,
        "CreatedAt":"2018-12-20T10:36:47+08:00",
        "User":{
            "Id":1,
            "Name":"test",
            "Order":null
        }
    }

    获取用户数据,然而,获取到Order的值是null。假如要获取某个用户获取的所有订单,是不是要通过业务逻辑处理?

    {
        "Id":1,
        "Name":"test",
        "Order":null
    }

    初始接触beego,文档看得我一脸懵逼!求指点!!

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 振兴 普通会员 1楼

      在Beego中,可以使用orm(Object-Relational Mapping)库来设置表关系。以下是一个简单的例子,假设我们有一个User和Role的模型,分别表示用户和角色,每个用户可以有多个角色,每个角色也可以有多个用户:

      ```go // User模型 type User struct { ID int Username string Password string Role Role }

      // Role模型 type Role struct { ID int Name string Users []User }

      // UserRole模型 type UserRole struct { UserID int RoleID int } ```

      在这个例子中,User模型有一个ID字段,代表用户ID,Username字段代表用户名,Password字段代表密码,Role字段代表角色ID。Role模型有一个ID字段,代表角色ID,Name字段代表角色名称,Users字段是一个用户列表,包含所有与该角色相关的用户。UserRole模型有一个UserID和RoleID字段,分别代表用户ID和角色ID。

      在配置orm的过程中,我们可以通过以下方式设置表关系:

      1. 在beego的main.go文件中引入orm库:

      ```go package main

      import ( "database/sql" "fmt" "log" "github.com/go-sql-driver/mysql" "github.com/go-orm/orm" )

      func main() { // 创建数据库连接 db, err := sql.Open("mysql", "user:password@tcp(localhost:3306)/database") if err != nil { log.Fatal(err) }

      // 注册ORM库
      err = orm.Register(&db)
      if err != nil {
          log.Fatal(err)
      }
      
      // 创建User模型
      user := User{ID: 1, Username: "admin", Password: "password", Role: Role{ID: 1}}
      userRole := UserRole{UserID: 1, RoleID: 1}
      
      // 插入User模型到数据库
      _, err = db.Exec("INSERT INTO `users`(`username`, `password`, `role`) VALUES (?, ?, ?)", user.Username, user.Password, userRole.Name)
      if err != nil {
          log.Fatal(err)
      }
      
      // 插入Role模型到数据库
      _, err = db.Exec("INSERT INTO `roles`(`name`, `users`) VALUES (?, ?)", userRole.Name, userRole.Users)
      if err != nil {
          log.Fatal(err)
      }
      
      // 查询用户和角色关系
      var result map[int]int
      err = db.QueryRow("SELECT `users`.ID, `users`.Username, `users`.Password, `roles`.ID, `roles`.Name FROM `users` JOIN `roles` ON `users`.ID = `roles`.UserID WHERE `users`.Name = ? AND `roles`.Name = ?", "admin", "admin", nil).Scan(&result)
      if err != nil {
          log.Fatal(err)
      }
      
      fmt.Println(result)
      

      } ```

      在这个例子中,我们首先创建了一个数据库连接,然后注册了ORM库。然后,我们创建了User模型和Role模型,并在数据库中插入了两个用户和两个角色。接下来,我们查询了两个用户和两个角色的关系,结果是一个映射,其中每个用户对应一个角色,每个角色对应一个用户。最后,我们打印出了查询结果。

      注意:这只是一个基本的例子,实际使用中可能需要根据你的具体需求和数据库表结构进行修改。例如,你可能需要处理更复杂的查询,或者处理插入和更新操作。此外,还需要处理用户和角色之间的关系,这可能需要使用子查询、JOIN操作或子查询和JOIN操作的组合等。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部