描述了数据结构
描述了数据结构
从PHP处理数据库,我们将依靠学说,一套库,帮助开发人员管理数据库:教义DBAL(数据库抽象层),教义ORM(图书馆来操纵数据库内容使用PHP对象),和教义迁移。
配置原则ORM
学说如何知道数据库连接吗?教义的配方添加一个配置文件,配置/包/ doctrine.yaml
,控制其行为。主要设置数据库DSN,一个字符串包含所有的信息连接:凭证,主机、端口,等等。默认情况下,教条查找DATABASE_URL
环境变量。
几乎所有的安装包有一个配置下配置/包/
目录中。在大多数情况下,默认值已被选定仔细为大多数应用程序工作。
理解Symfony环境变量约ob娱乐下载定
您可以定义DATABASE_URL
手动的.env
或.env.local
文件。事实上,由于包的配方,你会看到一个例子DATABASE_URL
在你的.env
文件。但由于当地的港口码头工人可以改变PostgreSQL暴露,很麻烦。有一个更好的方法。
而不是硬编码DATABASE_URL
在一个文件中,我们可以前缀的所有命令ob娱乐下载
。这将会跑到码头工人和/或检测服务平台。sh(当隧道开放)和自动设置环境变量。
码头工人组成和平台。sh工作无缝Symfony多亏了这些环境变量。ob娱乐下载
检查所有暴露环境变量通过执行ob娱乐下载symfony var:出口
:
1
美元ob娱乐下载symfony var:出口
1 2
DATABASE_URL = postgres: / /主要:main@127.0.0.1:32781 /主要吗?sslmode = disable&charset = utf8 #……
还记得数据库
服务名称用于码头工人和平台。sh配置?服务名称作为前缀定义环境变量DATABASE_URL
。如果你的服务命名根据Symfony的约定,不需要其他配置。ob娱乐下载
请注意
数据库的不仅仅是服务,受益于Symfony约定。ob娱乐下载梅勒也是一样,例如(通过MAILER_DSN
环境变量)。
更改默认在.env DATABASE_URL价值
我们仍然会改变.env
设置默认的文件DATABASE_URL
使用PostgreSQL:
1 2 3 4 5 6 7 8 9 10 11
- - - a / .env+ + + b / .env@@ -28 7 + 28 7 @@ MESSENGER_TRANSPORT_DSN =学说:/ /默认吗?auto_setup = 0 # # DATABASE_URL = " sqlite: / / / % kernel.project_dir % / var /数据。db“# DATABASE_URL = " mysql: / / db_user: db_password@127.0.0.1:3306 / db_name ? serverVersion = 5.7 "-DATABASE_URL = " postgresqlob娱乐下载: / / symfony: ChangeMe@127.0.0.1:5432 / app ? serverVersion = 13 charset = utf8 "+ DATABASE_URL = " postgresql: / / 127.0.0.1:5432 / db ? serverVersion = 13 charset = utf8 "# # # <教义/ doctrine-bundle # # # # # # ob娱乐下载> symfony /信使# # #
为什么信息需要重复在两个不同的地方吗?因为一些云平台ob直播app构建时间,数据库URL可能不为人所知,但原则需要知道数据库的引擎来构建它的配置。所以,主机、用户名和密码不太在意。
创建实体类
一个会议可以用几个属性:描述
- 的城市会议的组织;
- 的一年会议的;
- 一个国际国旗,表示如果是本地或国际会议(SymfonyLive vs SymfonyCon)。ob娱乐下载
制造商包可以帮助我们生成一个类(一个实体类)代表一个会议。
现在,是时候来生成的会议
实体:
1
美元ob娱乐下载symfony控制台:实体会议
这个命令是互动:它将指导您完成你所需要添加的所有字段的过程。使用以下的答案(大部分都是默认值,所以你可以按“输入”键使用):
城市
,字符串
,255年
,没有
;一年
,字符串
,4
,没有
;的国际
,布尔
,没有
。
这是完整的输出在运行命令:
1 2 3 4 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 52 53 54
创建:src /实体/会议。php创建:src /仓库/ ConferenceRepository。php生成实体!现在让我们添加一些字段!你可以添加多个字段后手动或通过重新运行这个命令。新的属性名(按<返回>停止添加字段):>城市字段类型(输入?查看所有类型)[string]: >字段长度[255]:>可以在数据库中该字段为null(可以为空)(yes / no)[不]:>更新:src /实体/会议。php添加另一个属性吗?输入属性名称(或按<返回>停止添加字段):>年字段类型(输入?查看所有类型)[string]: >字段长度[255]:> 4可以在数据库中该字段为null(可以为空)(yes / no)[不]:>更新:src /实体/会议。php添加另一个属性吗?输入属性名称(或按<返回>停止添加字段):>国际字段类型(输入?看到所有类型)(布尔):>可以在数据库中该字段为null(可以为空)(yes / no)[不]:>更新:src /实体/会议。php添加另一个属性吗? Enter the property name (or press to stop adding fields): > Success! Next: When you're ready, create a migration with make:migration
的会议
类下储存应用实体\ \
名称空间。
命令还生成一个教义存储库类:App \ Repository \ ConferenceRepository
。
生成的代码看起来像下面的(只有一小部分的文件复制):
注意,类本身是一个简单的PHP类和没有原则的迹象。属性是用于添加元数据用于学说将类映射到相关的数据库表中。
理论添加了一个id
属性来存储数据库表中的主键的行。这个键(ORM \ Id ()
)是自动生成的(ORM \ GeneratedValue ()
)通过一个策略,取决于数据库引擎。
现在,生成一个实体类会议评论:
1
美元ob娱乐下载symfony控制台:实体发表评论
输入以下答案:
作者
,字符串
,255年
,没有
;文本
,文本
,没有
;电子邮件
,字符串
,255年
,没有
;createdAt
,datetime_immutable
,没有
。
连接实体
两个实体,会议和评论,应该联系在一起。会议可以有零个或多个评论,这被称为一对多的关系。
使用:实体
命令再次添加这个关系会议
类:
1 2 3 4 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
你的实体已经存在!让我们添加一些新领域!新的属性名(按<返回>停止添加字段):>注释字段类型(输入?查看所有类型)[string]: >对这个实体应该与哪个班?:>评论一个新的属性也将被添加到评论类…新字段名在评论(会议):>是评论。会议性质允许null(可以为空)?(yes / no)[是]:>没有你想激活orphanRemoval你们的关系?评论是“孤儿”时从相关会议。例如$会议- > removeComment(评论美元)注:如果评论可能* *从一个会议到另一个改变,回答“不”。你想自动删除孤儿App \实体\评论对象(orphanRemoval) ?(yes / no)[不]:>是的更新:src /实体/会议。php更新:src /实体/ Comment.php
请注意
如果你输入吗?
作为类型的回答,你会得到所有支持的类型:
1 2 3 4 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
主要类型*文本字符串* *布尔*整数(或短整型、长整型数字)/协会* *浮动关系关系(一个向导将帮助您构建的关系)* ManyToOne * OneToMany * ManyToMany * OneToOne数组/对象类型*数组(或simple_array) * json对象* *二进制*团日期/时间* datetime类型(或datetime_immutable) * datetimetz(或datetimetz_immutable) *日期(或date_immutable) *时间(或time_immutable) * dateinterval其他类型*十进制* * json_array guid
看一看后的实体类的完整diff添加的关系:
1 2 3 4 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 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
- - - / src /实体/ Comment.php+ + + b / src /实体/ Comment.php@@ -36 6 + 36 12 @@类评论* /私人createdAt美元;+ # [ORM \ ManyToOne (inversedBy:“评论”)]+ # (ORM \ JoinColumn(可以为空:false))美元+私人会议会议;+公共函数getId (): int ?{返回$ this - > id;@@ -88、4 + 94,16美元@@类评论返回;}++公共职能getConference(): ?会议+ {+ $ this - >返回会议;+}++公共函数setConference (?会议会议美元):自我+ {= $ + $ this - >会议会议;+美元+返回;+}}- - - / src /实体/ Conference.php+ + + b / src /实体/ Conference.php@@ 2,6 + 2,8 @@名称空间的应用程序\实体;+使用原则\常见\ \ ArrayCollection集合;+使用原则\常见\集合\集合;使用原则\ ORM \ ORM映射;/ * * @@ -31 6 + 33岁16 @@类* /私人美元的国际会议;+ # [ORM \ OneToMany (targetEntity:评论::类的mappedBy:“会议”,orphanRemoval: true))+私人美元评论;++公共__construct()函数+ {+ $ this - >评论= new ArrayCollection ();+}+公共函数getId (): int ?{返回$ this - > id;@@ -71、4 + 83,35美元@@类会议返回;}++ / * *+ * @return收藏|评论[]+ * /+公共职能getComments():收集+ {+返回$ this - >评论;+}++公共职能addComment(评论评论美元):自我+ {+如果(! $ this - >评论>包含(评论美元)){+ $ this - >评论[]= $评论;+ $评论- > setConference ($);+}+美元+返回;+}++公共职能removeComment(评论评论美元):自我+ {+如果($ this - >评论- >包含(评论美元)){+ $ this - >评论- > removeElement($评论);+ / /拥有端设置为null(除非已经改变了)+如果($评论- > getConference () = = = $) {+ $评论- > setConference(空);+}+}+美元+返回;+}}
所有你需要管理已经为您生成的关系。一旦生成,代码变成你的;随意定制你所希望的方式。
添加更多属性
我刚意识到,我们已经忘记了添加一个属性在评论实体:会议的与会者可以附加一张照片来说明他们的反馈。
运行:实体
再一次,并添加一个photoFilename
属性/列的类型字符串
,但允许零
上传一张照片是可选的:
1
美元ob娱乐下载symfony控制台:实体发表评论
迁移数据库
项目模型已经完全被两个生成的类。
接下来,我们需要创建数据库表与这些PHP相关实体。
教义迁移这样一个任务是完美的匹配。它已经被安装的一部分orm
依赖。
一个迁移是一个类,描述了变化需要更新数据库模式从其当前状态定义的新实体的属性。作为现在的数据库是空的,迁移应该包含两个表的创造。
让我们看看学说产生:
1
美元ob娱乐下载symfony控制台:迁移
注意生成的输出文件名称(名称的样子迁移/ Version20191019083640.php
):
更新生产数据库
生产数据库迁移所需的步骤是一样的你已经熟悉的:提交更改和部署。
当部署项目时,平台。sh更新代码,而且运行如果任何(它检测到如果数据库迁移原则:迁移:迁移
命令存在)。
要进一步
- 数据库和教义ORM在Syob娱乐下载mfony应用程序;
- ob娱乐下载SymfonyCasts理论教程;
- 工作与教义协会/关系;
- DoctrineMigrationsBundle文档。
美元ob娱乐下载symfony控制台:实体会议