sql - 如何在 gorm 中创建外键?

标签 sql go go-gorm

所以我在应用程序中有两个表:usersposts。我想实现一个用户可以喜欢帖子的喜欢功能。为此,我创建了下表:

type Like struct {
    PostId    string    `json:"post_id"`
    UserId    string    `json:"user_id"`
    CreatedAt time.Time `json:"created_at"`
}

我的问题是当我AutoMigrate Like 模型时,我怎样才能自动设置外键?

我已经尝试在各自的位置使用 gorm:"foreignKey:Post"gorm:"foreignKey:User" 结构标签但他们什么都不做。

我怎样才能让它发挥作用?谢谢!

最佳答案

由于您在命名时没有遵循约定(即 Id 而不是 ID,PostId 而不是 PostID),您需要明确告诉 gorm 哪个是外键并引用哪个属性。

这是片段。 Github Link

引用:

  1. Belongs To
  2. Has Many
package storage2

import (
    "log"

    "gorm.io/driver/sqlite"
    "gorm.io/gorm"
    "gorm.io/gorm/logger"
)

type Post struct {
    Body   string `gorm:"type:text"`
    Id     string `gorm:"type:uuid;primary_key"`
    Likes  []Like `gorm:"foreignkey:PostId;references:Id"`
    User   User   `gorm:"foreignkey:UserId;references:Id"`
    UserId string
}

type Like struct {
    Id     string `gorm:"type:uuid;primary_key"`
    PostId string `gorm:"type:uuid;not null"`
    User   User   `gorm:"foreignkey:UserId;references:Id"`
    UserId string
}

type User struct {
    Id   string `gorm:"type:uuid;primary_key"`
    Name string
}

func GormTest() {
    db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{
        Logger: logger.Default.LogMode(logger.Info),
    })
    if err != nil {
        log.Fatal("could not open database")
    }
    err = db.AutoMigrate(&User{}, &Post{}, &Like{})
    if err != nil {
        log.Fatal("could not migrate database")
    }
    createTestData(db)
    fetchData(db)
}

func createTestData(db *gorm.DB) {
    users := []User{
        {Id: "0b83313d-1f85-4093-8621-efd2f21419d3", Name: "Shahriar"},
        {Id: "bddd6566-bcd2-4ad1-8eb9-65a23f5a9856", Name: "John"},
        {Id: "663c1328-dce2-4527-aecb-7fc478c229c2", Name: "Durand"}}
    err := db.Create(&users).Error
    if err != nil {
        log.Println("failed to create user data")
    }
    like := Like{
        Id:     "45ba45fc-0900-4fcc-80dd-c394170b777b",
        UserId: users[0].Id,
    }
    post := Post{
        Id:     "4cebb4c7-d44e-4160-a2df-a06f43211d45",
        Body:   "Test Post",
        Likes:  []Like{like},
        UserId: users[1].Id,
    }
    err = db.Create(&post).Error
    if err != nil {
        log.Println("failed to crete post")
    }
}

func fetchData(db *gorm.DB) {
    post := Post{
        Id: "4cebb4c7-d44e-4160-a2df-a06f43211d45",
    }
    if err := db.Preload("Likes").First(&post).Error; err != nil {
        log.Println("failed to load post")
    }
    log.Println(post)
}

关于sql - 如何在 gorm 中创建外键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74935777/

相关文章:

mysql - 选择特定的 MySQL 行出现次数来计算平均值

unit-testing - 如何在 golang 中注入(inject)一个 url 到 httptest.server?

Golang gorm 有(就像在 Laravel 中)等效的方法?

linux - 日期转换代码在不同机器上表现不同

postgresql - 在 Gorm 模型中添加整数数组作为数据类型

go-gorm - Gorm 中的级联删除不会删除关联表

asp.net - 服务器标记的格式不正确。查询字符串和数据绑定(bind)

sql - 如何创建数据成为列

c# - 如果存在,则在 gridview 的特定列中突出显示 SQL 表中存在的关键字

go - 构建时在 golang 中找不到包 "github.com/user../../"