如何从现有的数据库生成实体

编辑本页

警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 3.0,现已不再维护。

本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。

如何从现有的数据库生成实体

当开始一个使用数据库的全新项目时,会出现两种不同的情况。在大多数情况下,数据库模型是从头设计和构建的。但是,有时您将从现有的且可能不可更改的数据库模型开始。幸运的是,Doctrine附带了一堆工具来帮助您从现有的数据库生成模型类。

请注意

随着理论工具文档欧宝官网下载app就是说,逆向工程是启动一个项目的一次性过程。Doctrine能够根据字段、索引和外键约束转换大约70-80%的必要映射信息。Doctrine无法发现反向关联、继承类型、外键为主键的实体或关联上的语义操作(如级联或生命周期事件)。随后需要对生成的实体进行一些额外的工作,以设计每个实体以适合您的领域模型特性。

本教程假设你正在使用一个简单的博客应用程序,有以下两个表:blog_post而且blog_comment.由于外键约束,评论记录链接到发布记录。

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
创建表格“blog_post”“id”长整型数字20.AUTO_INCREMENT,“标题”varcharOne hundred.核对utf8_unicode_ci“内容”量变核对utf8_unicode_ci“created_at”datetime、主关键“id”) )引擎InnoDBAUTO_INCREMENT =1默认的字符集= utf8核对= utf8_unicode_ci;创建表格“blog_comment”“id”长整型数字20.AUTO_INCREMENT,“post_id”长整型数字20.“作者”varchar20.核对utf8_unicode_ci“内容”量变核对utf8_unicode_ci“created_at”datetime、主关键“id”),关键“blog_comment_post_id_idx”“post_id”),约束“blog_post_id”外国关键“post_id”参考文献“blog_post”“id”删除级联引擎InnoDBAUTO_INCREMENT =1默认的字符集= utf8核对= utf8_unicode_ci;

方法中正确地设置了数据库连接参数应用程序/配置/ parameters.yml文件(或数据库配置保存的任何地方),并且您已经初始化了一个包,该包将承载您未来的实体类。在本教程中,假设存在一个AcmeBlogBundle,并且位于src / Acme / BlogBundle文件夹中。

从现有数据库构建实体类的第一步是要求Doctrine内省数据库并生成相应的元数据文件。元数据文件描述了基于表字段生成的实体类。

1
$ php bin/控制台doctrine:mapping:import——force AcmeBlogBundle xml

命令行工具要求Doctrine自检数据库并生成XML元数据文件src / Acme / BlogBundle /资源/ config /学说你的包的文件夹。这会生成两个文件:BlogPost.orm.xml而且BlogComment.orm.xml

提示

还可以通过将最后一个参数更改为来生成YAML格式的元数据文件yml

生成的BlogPost.orm.xml元数据文件如下所示:

1 2 3 4 5 6 7 8 9 10 11
< ?XML版本="1.0"编码="utf-8"?><doctrine-mappingxmlns“http://doctrine-project.org/schemas/orm/doctrine-mapping”xmlns: xsi“http://www.w3.org/2001/XMLSchema-instance”xsi: schemaLocation“http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd”><实体的名字“Acme \ BlogBundle \实体\博客”表格“blog_post”><id的名字“id”类型“长整型数字“id”><发电机策略“身份”/>id><的名字“标题”类型“字符串”“标题”长度“100”可以为空“假”/><的名字“内容”类型“文本”“内容”可以为空“假”/><的名字“createdAt”类型“datetime”“created_at”可以为空“假”/>实体>doctrine-mapping>

生成元数据文件之后,您可以通过执行以下两个命令要求Doctrine构建相关的实体类。

1 2
$ php bin/console doctrine:mapping:convert annotation ./src $ php bin/console doctrine:generate:entities

第一个命令生成带有注释映射的实体类。但是如果希望使用YAML或XML映射而不是注释,则应该只执行第二个命令。

谨慎

如果要使用注释,必须在运行这两个命令后删除XML(或YAML)文件。这是必要的,因为映射配置格式不能混合使用

例如,新创建的BlogComment实体类如下所示:

12 34 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
/ / src / Acme / / BlogComment.php BlogBundle /实体名称空间AcmeBlogBundle实体使用学说ORM映射作为ORM/** * Acme\BlogBundle\Entity\BlogComment **@ORM\表(name = " blog_comment ") *@ORM实体\ * /BlogComment/ * * *@var整数$id * *@ORM\列(name="id", type="bigint") *@ORM\ Id *@ORM\ GeneratedValue(策略= "身份")* /私人id/ * * *@var字符串$author * *@ORM\Column(name="author", type="string", length=100, nullable=false) */私人作者/ * * *@var文本$content * *@ORM\Column(name="content", type="text", nullable=false) */私人内容/ * * *@vardatetime $createdAt * *@ORM\Column(name="created_at", type="datetime", nullable=false) */私人createdAt/ * * *@var博客* *@ORM\ ManyToOne (targetEntity = "博客")*@ORM\JoinColumn(name="post_id", referencedColumnName="id") */私人帖子;}

如您所见,Doctrine将所有表字段转换为纯私有和带注释的类属性。最令人印象深刻的是,它还发现了与之的关系博客基于外键约束的实体类。因此,你可以找到一个私人美元的帖子属性映射为博客中的实体BlogComment实体类。

请注意

如果希望拥有一对多关系,则需要手动将其添加到实体或生成的XML或YAML文件中。属性定义的特定实体的部分inversedBy的mappedBy碎片。

生成的实体现在可以使用了。玩得开心!

此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。