You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在drogon的model.json中正确声明复合键数据库关系?

如何在Drogon的model.json中正确声明复合键关联关系?

场景说明

QuizQuestions表以quiz_ID和question_ID作为复合主键,Responses表通过这两个字段与QuizQuestions表建立关联,对应的SQL建表语句如下:

CREATE TABLE `QuizQuestions` (
  `quiz_ID` int(11) NOT NULL,
  `question_ID` int(11) NOT NULL,
  `ordinal` int(11) NOT NULL,
  PRIMARY KEY (`quiz_ID`,`question_ID`),
  KEY `QuizQuestions_Questions_FK` (`question_ID`),
  CONSTRAINT `QuizQuestions_Questions_FK` FOREIGN KEY (`question_ID`) REFERENCES `Questions` (`question_ID`),
  CONSTRAINT `QuizQuestions_Quizzes_FK` FOREIGN KEY (`quiz_ID`) REFERENCES `Quizzes` (`quiz_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE `Responses` (
  `student_ID` int(11) NOT NULL,
  `quiz_ID` int(11) NOT NULL,
  `attempt_no` int(11) NOT NULL,
  `question_ID` int(11) NOT NULL,
  `student_attempt` varchar(100) DEFAULT NULL,
  `teacher_feedback` varchar(100) DEFAULT NULL,
  `student_feedback` varchar(100) DEFAULT NULL,
  `mark` int(11) DEFAULT NULL,
  PRIMARY KEY (`student_ID`,`quiz_ID`,`attempt_no`,`question_ID`),
  KEY `Responses_QuizQuestions_FK` (`quiz_ID`,`question_ID`),
  CONSTRAINT `Responses_QuizQuestions_FK` FOREIGN KEY (`quiz_ID`, `question_ID`) REFERENCES `QuizQuestions` (`quiz_ID`, `question_ID`),
  CONSTRAINT `Responses_Students_FK` FOREIGN KEY (`student_ID`) REFERENCES `Students` (`student_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

错误配置的问题

如果像下面这样分开声明两个单键的has many关系,会导致drogon_ctl create model生成重复的关系函数,触发源码重定义错误,同时逻辑上也不正确:

{
    "type": "has many",
    "original_table_name": "QuizQuestions",
    "original_table_alias": "",
    "original_key": "quiz_ID",
    "target_table_name": "Responses",
    "target_table_alias": "",
    "target_key": "quiz_ID",
    "enable_reverse": false
},
{
    "type": "has many",
    "original_table_name": "QuizQuestions",
    "original_table_alias": "",
    "original_key": "question_ID",
    "target_table_name": "Responses",
    "target_table_alias": "",
    "target_key": "question_ID",
    "enable_reverse": false
},

正确的复合键关联配置

要正确声明复合键的has many关系,需要将复合键字段以数组形式填入original_key和target_key中,只保留一个关系条目即可:

{
    "type": "has many",
    "original_table_name": "QuizQuestions",
    "original_table_alias": "",
    "original_key": ["quiz_ID", "question_ID"],
    "target_table_name": "Responses",
    "target_table_alias": "",
    "target_key": ["quiz_ID", "question_ID"],
    "enable_reverse": false
}

这样配置后,drogon_ctl会生成正确的关联函数,既不会出现重定义错误,也能准确映射复合键的关联逻辑。


内容的提问来源于stack exchange,提问作者ArchNemSyS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 10:15:06