我们有一个数据库模式,以简化(略微设计)的形式,如下所示:
从用户到域的外键设置在列(domainID,groupID)上,以保证参照完整性.该结构适用于预期目的.
但是,对于与同一数据库通信的新应用程序,我现在需要为Doctrine创建映射上述结构的映射,包括两列上的外键关系.
我尝试过以下方法:
但这给了我一个错误:
UnitOfWork.PHP第2649行:未定义的索引:groupID
所以,我的问题是:
在Doctrine中描述多列多对一外键关系的正确方法是什么?
为了完整起见,数据库为模式创建代码,如上面的ERD中所述:
CREATE table `users` ( `userID` INT(10) UNSIGNED NOT NulL auto_INCREMENT,`groupID` INT(10) UNSIGNED NOT NulL,`domainID` INT(10) UNSIGNED NOT NulL,`someData` VARCHAR(32),PRIMARY KEY (`userID`),KEY `key_users_groupID_domainID` (`groupID`,`domainID`)) ENGINE=InnoDB;CREATE table `domains` ( `domainID` INT(10) UNSIGNED NOT NulL auto_INCREMENT,`someOtherData` VARCHAR(32),PRIMARY KEY (`domainID`),KEY `key_domains_groupID` (`groupID`)) ENGINE=InnoDB;CREATE table `groups` ( `groupID` INT(10) UNSIGNED NOT NulL auto_INCREMENT,`someMoreData` VARCHAR(32),PRIMARY KEY (`groupID`)) ENGINE=InnoDB;ALTER table `users` ADD CONSTRAINT `fk_users_domains` FOREIGN KEY (`groupID`,`domainID`) REFERENCES `domains` (`groupID`,`domainID`),ADD CONSTRAINT `fk_users_groups` FOREIGN KEY (`groupID`) REFERENCES `groups` (`groupID`);ALTER table `domains` ADD CONSTRAINT `fk_domains_groups` FOREIGN KEY (`groupID`) REFERENCES `groups` (`groupID`);
最佳答案这不是你问题的绝佳答案.另外,我从未使用过Doctrine或Doctrine2.但是我花了一些时间环顾四周,并且最后得到了前三个参考文献:Doctrine multiple composite foreign key,一个问题,虽然它没有显示XML映射,并且可能是偏离基础的,至少它似乎是关于FK中的多列.并根据答案回答关于Doctrine2的某些方面的问题.
Doctrine2 Map entities with composite foreign keys in …一个问题虽然没有多大价值,但至少可以作为一个骗子候选人加入你的问题.
XML Mapping Doctrine2 XML映射文档.搜索文本多重没有价值,但搜索复合材料时说:
For composite keys you can specify more than one ID-element,however
surrogate keys are recommended for use with Doctrine 2.
这让我想到了代理商Wikipedia的定义:
The surrogate is internally generated by the system and is invisible
to the user or application.
和Natural vs Surrogate.关于在两者之间进行选择的讨论.
回到你的模型,按照独立性递减的顺序列出:
CREATE table `groups` ( `groupID` INT(10) UNSIGNED NOT NulL auto_INCREMENT,PRIMARY KEY (`groupID`)) ENGINE=InnoDB;CREATE table `domains` ( `domainID` int(10) unsigned NOT NulL auto_INCREMENT,`groupID` int(10) unsigned NOT NulL,`someOtherData` varchar(32) DEFAulT NulL,KEY `key_domains_groupID` (`groupID`),CONSTRAINT `fk_domains_groups` FOREIGN KEY (`groupID`) REFERENCES `groups` (`groupID`)) ENGINE=InnoDB DEFAulT CHARSET=utf8;CREATE table `users` ( `userID` int(10) unsigned NOT NulL auto_INCREMENT,`domainID` int(10) unsigned NOT NulL,`someData` varchar(32) DEFAulT NulL,CONSTRAINT `fk_users_domains` FOREIGN KEY (`groupID`,CONSTRAINT `fk_users_groups` FOREIGN KEY (`groupID`) REFERENCES `groups` (`groupID`)) ENGINE=InnoDB DEFAulT CHARSET=utf8;
一些划痕工作:
truncate table groups; -- disalloweddelete from groups;alter table groups auto_increment 1; -- reset,after running delete from.insert groups(someMoreData) values ('group0001'),('group0002');select * from groups;insert domains(groupID,someOtherData) values (1,'sod'),(1,(2,'sod');select * from domains; -- AI 1 to 5 aboveinsert users(groupID,domainID,someData) values (1,1,'sd'); -- successinsert users(groupID,3,4,'sd'); -- Error 1452 fk failure
很明显,用户并不真正需要复合FK到域中.相反,它只需要一个列FK进入域的替代AI PK.这足以完成与你正在做的相同的效果.
与此一致,users.domainID就足够了,users.groupID引入了非规范化,后者应该被丢弃.
无论如何,希望这是有帮助的.
总结以上是内存溢出为你收集整理的php – 如何在Doctrine映射中描述多列外键全部内容,希望文章能够帮你解决php – 如何在Doctrine映射中描述多列外键所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)