【问题标题】:many to many in gorm v2 error on foreign key外键上的gorm v2错误中的多对多
【发布时间】:2023-02-08 06:44:54
【问题描述】:

我发现在以下情况下很难使用 Gorm 定义多对多关系

features(feature_id, name, slug)
operations(operation_id, name, slug)
feature_operations(feature_id, operation_id)

type Feature struct {
    FeatureID  int64       `gorm:"primaryKey;column:feature_id" json:"feature_id"`
    Name       string      `validate:"required" json:"name"`
    Slug       string      `json:"slug"`
    Status     string      `json:"status"`
    Operations []Operation `gorm:"many2many:feature_operations;foreignKey:feature_id"`
    appModels.BaseModel
}

使用feature_id 时出现错误

列 feature_operations.feature_feature_id 不存在

使用id时,出现错误

无效的外键:id

【问题讨论】:

    标签: go go-gorm


    【解决方案1】:

    看起来您没有使用 gorm 建议您将主键列命名为 id 的约定

    所以在你的情况下你的foreignKey应该是字段的名称,你还需要使用References来指定你想要引用的列。请参阅此处的示例: https://gorm.io/docs/many_to_many.html#Override-Foreign-Key

    你需要的是这个:

    type Feature struct {
        FeatureID  int64 `gorm:"primaryKey;column:feature_id"`
        Name       string
        Slug       string
        Operations []Operation `gorm:"many2many:feature_operations;foreignKey:FeatureID;References:OperationID"`
    }
    
    type Operation struct {
        OperationID int64 `gorm:"primaryKey;column:operation_id"`
        Name        string
        Slug        string
    }
    

    在此之后,连接表将是FEATURE_OPERATIONS,包含两列FEATURE_FEATURE_IDOPERATION_OPERATION_ID

    如果您不喜欢冗余的列名,那么您需要使用两个附加属性 joinForeignKeyjoinReferences 来为列选择您自己的名称,如下所示:

    gorm:"many2many:feature_operations;foreignKey:FeatureID;joinForeignKey:FeatureID;References:OperationID;joinReferences:OperationID"

    所有这些额外的工作都是必需的,因为您的主键是 FEATURE_IDOPERATION_ID 而不仅仅是 ID 如果您可以重命名该列以遵循惯例,您会发现使用 gorm 会容易得多

    【讨论】:

    • 感谢您的回复。 @Kaus2b 我也尝试添加引用,但结果与我上面提到的相同。 go.dev/play/p/bSbUiNqCfYS?v=goprev
    • @SujitBaniya 用更具体的细节更新上面的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-13
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    • 2016-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多