Я хочу генерировать объекты из существующей базы данных с помощью инструментов Doctrine для обратной инженерии
/* * SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for `country` -- ---------------------------- DROP TABLE IF EXISTS `country`; CREATE TABLE `country` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL DEFAULT '', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=38 DEFAULT CHARSET=utf8; -- ---------------------------- -- Table structure for `provider` -- ---------------------------- DROP TABLE IF EXISTS `provider`; CREATE TABLE `provider` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL DEFAULT '', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8; -- ---------------------------- -- Table structure for `provider_country` -- ---------------------------- DROP TABLE IF EXISTS `provider_country`; CREATE TABLE `provider_country` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `providerId` int(11) unsigned NOT NULL, `countryId` int(11) unsigned NOT NULL, PRIMARY KEY (`id`), KEY `fk_provider_has_id0_idx` (`providerId`), KEY `fk_user_country_idx` (`countryId`), CONSTRAINT `fk_rss_has_id` FOREIGN KEY (`providerId`) REFERENCES `provider` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT `fk_user_country` FOREIGN KEY (`countryId`) REFERENCES `country` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; SET FOREIGN_KEY_CHECKS=1; */
вы можете попросить Doctrine импортировать схему и построить связанные классы сущностей, выполнив следующие две команды.
1 $ php app/console doctrine:mapping:import AcmeBlogBundle annotation
2 $ php app/console doctrine:generate:entities AcmeBlogBundle
но теперь доктрина обнаруживает только отношение ManyToOne во многих сторонах только таблицы «ProviderCountry»
если мне нужно добавить отношение OneToMany, я должен добавить аннотацию моей рукой, добавив аннотацию follwing
в Provider.php добавить
/** * @ORM\OneToMany(targetEntity="ProviderCountry", mappedBy="providerId", cascade={"persist"}) */ private $datas;
в ProviderCountry.php добавить
/** * @var Provider * * @ORM\ManyToOne(targetEntity="Provider", inversedBy = "datas") * @ORM\JoinColumn(name="providerId", referencedColumnName="id") */ private $userid;
так как я могу обобщить аннотацию «Один-ко-многим» командой доктрины
Просто это изменение внутри доктрины orm lib,
вы можете исправить это, изменив
продавец / Доктрина / ОРМ / Библиотека / Doctrine / ОРМ / Mapping / Водитель / DatabaseDriver.php
замените следующие утверждения
foreach ($foreignKeys as $foreignKey) { $foreignTable = $foreignKey->getForeignTableName(); $cols = $foreignKey->getColumns(); $fkCols = $foreignKey->getForeignColumns(); $localColumn = current($cols); $associationMapping = array(); $associationMapping['fieldName'] = $this->getFieldNameForColumn($tableName, $localColumn, true); $associationMapping['targetEntity'] = $this->getClassNameForTable($foreignTable); if ($primaryKeyColumns && in_array($localColumn, $primaryKeyColumns)) { $associationMapping['id'] = true; } for ($i = 0; $i < count($cols); $i++) { $associationMapping['joinColumns'][] = array( 'name' => $cols[$i], 'referencedColumnName' => $fkCols[$i], ); } //Here we need to check if $cols are the same as $primaryKeyColums if (!array_diff($cols, $primaryKeyColumns)) { $metadata->mapOneToOne($associationMapping); } else { $metadata->mapManyToOne($associationMapping); } }
изменить на
foreach ($foreignKeys as $foreignKey) { $foreignTable = $foreignKey->getForeignTableName(); $cols = $foreignKey->getColumns(); $fkCols = $foreignKey->getForeignColumns(); $localColumn = current($cols); $associationMapping = array(); $associationMapping['fieldName'] = $this->getFieldNameForColumn($tableName, $localColumn, true); $associationMapping['targetEntity'] = $this->getClassNameForTable($foreignTable); for ($i = 0; $i < count($cols); $i++) { $associationMapping['joinColumns'][] = array( 'name' => $cols[$i], 'referencedColumnName' => $fkCols[$i], ); } $metadata->mapManyToOne($associationMapping); } foreach ($this->tables as $tableCandidate) { if ($this->_sm->getDatabasePlatform()->supportsForeignKeyConstraints()) { $foreignKeysCandidate = $tableCandidate->getForeignKeys(); } else { $foreignKeysCandidate = array(); } foreach ($foreignKeysCandidate as $foreignKey) { $foreignTable = $foreignKey->getForeignTableName(); if ($foreignTable == $tableName && !isset($this->manyToManyTables[$tableCandidate->getName()])) { $fkCols = $foreignKey->getForeignColumns(); $cols = $foreignKey->getColumns(); $localColumn = current($cols); $associationMapping = array(); $associationMapping['fieldName'] = $this->getFieldNameForColumn($tableCandidate->getName(), $tableCandidate->getName(), true); $associationMapping['targetEntity'] = $this->getClassNameForTable($tableCandidate->getName()); $associationMapping['mappedBy'] = $this->getFieldNameForColumn($tableCandidate->getName(), $localColumn, true); try { $primaryKeyColumns = $tableCandidate->getPrimaryKey()->getColumns(); if (count($primaryKeyColumns) == 1) { $indexColumn = current($primaryKeyColumns); $associationMapping['indexBy'] = $indexColumn; } } catch (SchemaException $e) { } $metadata->mapOneToMany($associationMapping); } } }
теперь, если вы запустите doctrine: mapping: import
вы найдете аннотацию OneToMany.
затем запустите doctrine: generate: entity
вы найдете однонаправленные отношения с обеих сторон.