Doctrine 2何时使用复合键出错?

时间:2012-07-11 07:19:39

标签: doctrine doctrine-orm composite-key

我最近正在阅读Doctrine 2's best practices并被此停止了:

  

25.3。避免使用复合键
   尽管Doctrine完全支持复合键,但最好不要在可能的情况下使用它们。复合键   需要Doctrine的额外工作,因此概率更高   错误。

我不明白的是:如果"Doctrine fully supports composite keys",在处理这些密钥时怎么会出错呢?

因此,我想将此问题视为社区维基,希望它能帮助我们了解"probability of errors"是什么:

您是否有示例分享您遇到的情况,Doctrine 2未能及时处理复合键?

2 个答案:

答案 0 :(得分:3)

就我而言,我相信我已经遇到了一些非常基本的数据库架构的问题,该架构包含一个主键由2个外键组成的表:

enter image description here

当我生成模型时,未创建与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之类的内容, arrayRECURSION ...):

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

功能请求:http://www.doctrine-project.org/jira/browse/DDC-1926

答案 1 :(得分:2)

表product_i18n上的问题是它没有主键。请尝试将product_idlocale_id设置为复合主键。学说2将生成实体。 doctrine 2实体需要主键。