php– 如何在Doctrine映射中描述多列外键

php– 如何在Doctrine映射中描述多列外键,第1张

概述我们有一个数据库模式,以简化(略微设计)的形式,如下所示:从用户到域的外键设置在列(domainId,groupId)上,以保证参照完整性.该结构适用于预期目的.但是,对于与同一数据库通信的新应用程序,我现在需要为Doctrine创建映射上述结构的映射,包括两列上的外键关系.我尝试过以下方法:<entity name='User' table='use

我们有一个数据库模式,以简化(略微设计)的形式,如下所示:

从用户到域的外键设置在列(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映射中描述多列外键所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/1168838.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)