如何从现有的数据库生成实体
编辑本页警告:您正在浏览的文档欧宝官网下载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,“标题”varchar(One 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.)不零,“作者”varchar(20.)核对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 /实体名称空间Acme\BlogBundle\实体;使用学说\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
碎片。
生成的实体现在可以使用了。玩得开心!