3

Doctrine 2私は最近、のベストプラクティスを読んでいて、これによって止められました。

25.3。複合キーを避ける
Doctrineは複合キーを完全にサポートしていますが、可能であればそれらを使用しないことをお勧めします。複合キーはDoctrineによる追加の作業を必要とするため、エラーが発生する可能性が高くなります。

私が得られないのはこれです:もしそうなら"Doctrine fully supports composite keys"、そのようなキーを扱うときにどうやって間違いを犯すことができますか?

したがって、コミュニティwikiとしてこの質問をしたいと思います。それが、私たちが何であるかを理解するのに役立つことを願っています"probability of errors"

Doctrine 2複合キーを適切に処理できなかった、または適切に処理されなかった状況を示す例を共有しますか?

4

2 に答える 2

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"

それでも、私のデータベーススキーマは適切に作成されたと思います。

  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 2Schema Managerは、Doctrineがその関係を完全に理解しているように見えることを示しています(var_dump出力がより簡潔になるように変更されました:、、などを削除しarrayますRECURSIONstring

$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、対応するエンティティモデルが生成されていないため、そのテーブルを操作できない状況にあります。

更新:user1136666指摘されたように:既知の問題と制限のページの頌歌は次のように述べています:

現在、主キー列として外部キーを含まない複合主キーをサポートしていると述べていますが。

回避策は、次のように、代理キーを定義し、外部キーに一意の制約を追加することです。

CREATE  TABLE IF NOT EXISTS `mydb`.`product_i18n` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  `name` VARCHAR(45) NULL ,
  `description` TEXT NULL ,
  `created_at` DATETIME NULL ,
  `modified_at` DATETIME NULL ,
  `product_id` INT NOT NULL ,
  `locale_id` INT NOT NULL ,
  INDEX `fk_product_i18n_locale` (`locale_id` ASC) ,
  INDEX `fk_product_i18n_product` (`product_id` ASC) ,
  PRIMARY KEY (`id`) ,
  UNIQUE (`locale_id` , `product_id`),
  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` )
ENGINE = InnoDB;

機能リクエスト: http: //www.doctrine-project.org/jira/browse/DDC-1926

于 2012-07-11T07:19:39.137 に答える
2

テーブルproduct_i18nの問題は、主キーがないことです。複合主キーとして設定product_idしてみてください。locale_idDoctrine2はエンティティを生成します。Doctrine2エンティティには主キーが必要です。

于 2012-07-11T17:40:18.133 に答える