我最近正在阅读Doctrine 2
's best practices并被此停止了:
25.3。避免使用复合键
尽管Doctrine完全支持复合键,但最好不要在可能的情况下使用它们。复合键 需要Doctrine的额外工作,因此概率更高 错误。
我不明白的是:如果"Doctrine fully supports composite keys"
,在处理这些密钥时怎么会出错呢?
因此,我想将此问题视为社区维基,希望它能帮助我们了解"probability of errors"
是什么:
您是否有示例分享您遇到的情况,Doctrine 2
未能及时处理复合键?
答案 0 :(得分:3)
就我而言,我相信我已经遇到了一些非常基本的数据库架构的问题,该架构包含一个主键由2个外键组成的表:
当我生成模型时,未创建与product_i18n
实体对应的实体:
$ php doctrine-module.php orm:convert-mapping --namespace="Dbi\Entity\\" \
--from-database --force annotation module/Dbi/src/
Processing entity "Dbi\Entity\Locale"
Processing entity "Dbi\Entity\Product"
$ php doctrine-module.php orm:generate-entities --generate-annotations=1 \
module/Dbi/src
Processing entity "Dbi\Entity\Locale"
Processing entity "Dbi\Entity\Product"
然而,我相信我的database schema已正确创建:
PRIMARY KEY (`product_id`, `locale_id`) ,
INDEX `fk_product_i18n_locale` (`locale_id` ASC) ,
INDEX `fk_product_i18n_product` (`product_id` ASC) ,
CONSTRAINT `fk_product_i18n_locale`
FOREIGN KEY (`locale_id` )
REFERENCES `mydb`.`locale` (`id` ),
CONSTRAINT `fk_product_i18n_product`
FOREIGN KEY (`product_id` )
REFERENCES `mydb`.`product` (`id` )
此外,Doctrine 2
的{{1}}表明,Doctrine似乎完全理解了这种关系(Schema Manager
输出已更改为更简洁:删除var_dump
之类的内容, array
,RECURSION
...):
string
因此我处于这样一种情况:我可以查询$em = $this->getServiceLocator()->get('doctrine.entitymanager.orm_default');
$sm = $em->getConnection()->getSchemaManager();
var_dump($sm->->listTables());
object(Doctrine\DBAL\Schema\Table)#290 (10) {
["_name":protected]=> "product_i18n"
["_indexes":protected]=>
["primary"]=>
["_columns":protected]=>
[0]=> "product_id"
[1]=> "locale_id"
["_fkConstraints":protected]=>
["fk_product_i18n_locale"]=>
object(Doctrine\DBAL\Schema\ForeignKeyConstraint)#285 (9) {
["_localColumnNames":protected]=> "locale_id"
["_foreignTableName":protected]=> "locale"
["_foreignColumnNames":protected]=> "id"
["fk_product_i18n_product"]=>
object(Doctrine\DBAL\Schema\ForeignKeyConstraint)#286 (9) {
["_localColumnNames":protected]=> "product_id"
["_foreignTableName":protected]=> "product"
["_foreignColumnNames":protected]=> "id"
表的模式,但不能与该表交互,因为没有生成相应的实体模型。
更新:,product_i18n
指出:known issues and limitations page颂歌声明如下:
虽然我们声明我们支持没有的复合主键 目前包含外键作为主键列。
解决方法是定义代理键并在外键上添加唯一约束,如下所示:
user1136666
答案 1 :(得分:2)
表product_i18n上的问题是它没有主键。请尝试将product_id
和locale_id
设置为复合主键。学说2将生成实体。 doctrine 2实体需要主键。