加入收藏 | 设为首页 | 会员中心 | 我要投稿 北几岛 (https://www.beijidao.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

php – Symfony2 Doctrine2 – 通过doctrine从现有数据库生成

发布时间:2021-07-06 05:18:57 所属栏目:大数据 来源: https://www.jb51.cc
导读:我想通过使用Doctrine工具进行逆向工程来从现有数据库生成实体 /* * SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for `country` -- ---------------------------- DROP TABLE IF EXISTS `country`; CREATE TABLE `countr

我想通过使用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 AcmeBlogBu??ndle annotation
??2 $PHP app / console doctrine:generate:entities AcmeBlogBu??ndle

但是现在的学说只检测了ManyToOne关系,在很多方面只有“ProviderCountry”表

如果我需要添加OneToMany关系,我必须通过添加下面的注释来添加注释

在Provider.PHP中添加

/**
 * @ORMOneToMany(targetEntity="ProviderCountry", mappedBy="providerId", cascade={"persist"})
 */
private $datas;

在ProviderCountry.PHP中添加

    /**
     * @var Provider
     *
     * @ORMManyToOne(targetEntity="Provider", inversedBy = "datas")
     * @ORMJoinColumn(name="providerId", referencedColumnName="id")
     */

private $userid;

那么如何通过doctrine命令生成一对多注释

解决方法:

这只是在学说orm lib中的变化,

你可以通过改变来解决这个问题

供应商/教义/ ORM / LIB /学说/ ORM /映射/驱动器/ 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:entities

你会发现双方的单向关系.

(编辑:北几岛)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读