私の側では、主キーが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 2
のSchema Manager
は、Doctrineがその関係を完全に理解しているように見えることを示しています(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
、対応するエンティティモデルが生成されていないため、そのテーブルを操作できない状況にあります。
更新: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