使用symfony2和doctrine从现有数据库生成单个实体

时间:2012-04-29 11:04:14

标签: php database symfony doctrine

是否可以使用Symfony2控制台工具从数据库生成单个实体?

在编码过程中,我必须添加一个表,并对现有的实体类进行了修改。所以我不希望我的所有实体都重新生成。

任何建议都将不胜感激!

11 个答案:

答案 0 :(得分:99)

我有同样的问题,你必须这样做:

php app/console doctrine:mapping:convert metadata_format \
    ./src/App/MyBundle/Resources/config/doctrine \
    --from-database \
    --filter="Yourtablename"

然后

php app/console doctrine:mapping:import AppMyBundle \
    metadata_format --filter="Yourtablename"

其中metadata_format是您要生成的文件结尾(例如xml,yml,annotation)

最后

php app/console doctrine:generate:entities AppMyBundle --no-backup

像这样的学说只会加载你需要的实体。只需要小心过滤器就必须使用CamelCase!

希望这会对你有所帮助

答案 1 :(得分:28)

对于第三个命令,doctrine不断重新生成所有Entity文件。通过在bundle之后添加实体名称,它只生成了我感兴趣的实体。

php app/console doctrine:generate:entities AppMyBundle:Yourtablename --no-backup

答案 2 :(得分:12)

Symfony 2.7选项注释和[/ xml / yml]的简单工作解决方案请参阅http://symfony.com/doc/current/cookbook/doctrine/reverse_engineering.html

分3个步骤执行3个命令:

$ php app/console doctrine:mapping:import --force AppBundle xml --filter="Meeting"

注意:,如果您的数据库名称为my_meeting您需要在MyMeeting中将其更改为filter="MyMeeting"以获取教程以查找您的表名。是因为doctrine总是会删除下划线并将Camel-case添加到你的表名中。如果没有,你会收到这个错误:&#34;数据库没有任何映射信息&#34; 。)< / p>

$ php app/console doctrine:mapping:convert annotation ./src/AppBundle/Entity --from-database --filter="Meeting"

注意:确保您的 Meeting.php 类文件中包含namespace AppBundle\Entity;,如下所示:

<?php
/**
* Created by PhpStorm.
* User:
* Date: 03-Sep-2015
* Time: 3:23 PM
*/
namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

如果不加入。)

其中:

  • AppBundle正是您的&#34; AppBundle&#34;在Symfony 2.7
  • 会议是目标表(Camel-Case sensitive)

请务必查看以下目录:

  

SRC \的appbundle /资源/配置/教义/ Meeting.orm.xml

确保您只有要创建实体类文件的表的.xml文件,而没有其他文件。然后运行以下命令为您先前创建的实体类生成get和set方法

  

$ php app / console doctrine:generate:entities AppBundle:Meeting --no-backup

注2: 作为最后一步,您必须删除xml doctrine orm db文件,例如src\AppBundle/Resources/config/doctrine/VisitorData.orm.xml

对我来说非常好。

有关说明,请阅读:http://symfony.com/doc/current/cookbook/doctrine/reverse_engineering.html

答案 3 :(得分:8)

@ fyrye目前隐藏的评论值得信赖,想要加上这个,以免其他人错过。这是方法:

/** @var \Doctrine\DBAL\Connection $connection */
$config = $connection->getConfiguration();

// for excluding an specific table
$config->setFilterSchemaAssetsExpression('/^(table_to_reverse_engineer_1|table_to_reverse_engineer_2).*$/');

来源:https://coderwall.com/p/jofhdw/doctrine-tell-which-tables-to-work-with

由于存在大量错误定义的旧表

,因此在运行以下命令时出现问题
php ./vendor/bin/doctrine orm:convert-mapping --force --from-database annotation ./src/UI/Entity/

事实证明--filter标志仅在它从所有表中读取元数据后过滤,如果它们没有主键或有其他问题,将导致命令失败< / p>

答案 4 :(得分:4)

使用 Symfony 3 ,这些答案都不适合我。我最终做了:

php bin/console doctrine:mapping:import --force MyBundle xml --filter="MyTable"

php bin/console doctrine:mapping:convert annotation ./src --filter="MyTable"

php bin/console doctrine:generate:entities MyBundle:MyTable --path ./src

答案 5 :(得分:3)

我会将此作为对已接受答案的评论,但我是新手。

对于那些像我这样的人来说 - 在映射中使用--filter开关映射多个具有重合字符串的表时,可以使用模式。

示例表名称:

供应商 VendorContact

php app/console doctrine:mapping:convert metadata_format \
    ./src/App/MyBundle/Resources/config/doctrine \
    --from-database \
    --filter="Vendor"

该命令将转换两个表而不仅仅是供应商。如果您只想要Vendor而不是VendorContact,请在--filter:

中使用模式
php app/console doctrine:mapping:convert metadata_format \
    ./src/App/MyBundle/Resources/config/doctrine \
    --from-database \
    --filter="\bVendor\b"

希望能帮助别人!

答案 6 :(得分:3)

也适用于Symfony 3。

如果您正在处理#34;没有元数据类来处理。&#34;消息尝试将您的tablename转换为过滤器参数中的Doctrine camel大小写。

&#34; MY_TABLE_NAME&#34;需要写成&#34; MyTableName&#34;。

答案 7 :(得分:3)

-filter使用实体名称,而不是表名称! php bin /控制台原则:映射:导入“ App \ Entity”注释--path = config / doctrine --filter =“ YourEntity”

答案 8 :(得分:1)

我与Symfony 2.4和MySQL有完全相同的问题。

上面发布的所有解决方法都不适用于我。

我最终创建了一个包含我想要提取的表的新数据库(这很容易做到,因为MySQL提供了创建脚本)。

然后更改了与该新数据库的连接,并从那里执行了实体提取命令。

似乎有点激进,但我不会手工创建实体。

希望有所帮助

答案 9 :(得分:0)

我没有为我的symfony 3.3工作。所以我刚创建了一个目录副本,并重新生成了copy目录中的所有实体。然后我在原始目录中复制了所需的实体。

- 由于此问题导致过滤器无效https://github.com/symfony/symfony/issues/7717

答案 10 :(得分:0)

Symfony 3

为新的“组”表生成实体

php bin/console doctrine:mapping:import "App\Entity" annotation --path=src/AppBundle/Entity --filter Group

enter image description here

symfony 3 documentation

所写