描述数据结构
描述数据结构
要处理来自PHP的数据库,我们将依赖于学说,一组帮助开发人员管理数据库的库:Doctrine DBAL(一个数据库抽象层)、Doctrine ORM(一个使用PHP对象操作数据库内容的库)和Doctrine Migrations。
配置Doctrine ORM
Doctrine如何知道数据库连接?Doctrine的配方添加了一个配置文件,配置/包/ doctrine.yaml
,控制它的行为。主要设置是数据库DSN,一个包含有关连接的所有信息的字符串:凭据、主机、端口等。默认情况下,Doctrine查找DATABASE_URL
环境变量。
几乎所有已安装的包都在配置/包/
目录中。大多数情况下,默认值都经过了仔细选择,以适用于大多数应用程序。
理解Symfony环境变量约ob娱乐下载定
你可以定义DATABASE_URL
手动在.env
或.env.local
文件。事实上,由于该软件包的配方,您将看到一个示例DATABASE_URL
在你的.env
文件。但是由于Docker公开的到PostgreSQL的本地端口可能会改变,这是相当麻烦的。有更好的办法。
而不是硬编码DATABASE_URL
在文件中,我们可以为所有命令加上前缀ob娱乐下载
.这将检测Docker和/或Platform.sh运行的服务(当隧道打开时)并自动设置环境变量。
由于这些环境变量,Docker Compose和Platform.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 #…
还记得数据库
服务名称在Docker和Platform.sh配置中使用?服务名用作定义环境变量的前缀,如DATABASE_URL
.如果您的服务是根据Symfony约定命名的,则不需要其他配置。ob娱乐下载
请注意
数据库并不是唯一受益于Symfony约定的服务。ob娱乐下载这同样适用于Mailer,例如(通过MAILER_DSN
环境变量)。
修改.env文件中的DATABASE_URL默认值
我们仍然会改变.env
文件设置默认值DATABASE_URL
使用PostgreSQL:
1 2 3 4 5 6 7 8 9 10 11
——/ .env+ + + b / .env@@ -29,7 +29,7 @@ MESSENGER_TRANSPORT_DSN=doctrine://default?auto_setup=0 # # DATABASE_URL="sqlite:///%kernel.project_dir%/var/data.db" # DATABASE_URL="mysql://app:!ChangeMe!serverVersion = 8 charset = utf8mb4”-DATABASE_URL = " postgresql: / / app: ChangeMe ! @127.0.0.1:5432 /应用程序吗?serverVersion = 14 charset = utf8 "+ DATABASE_URL = " postgresql: / / 127.0.0.1:5432 / db吗?serverVersion = 14 charset = utf8 "###<教条/教条-捆绑### ###> symfony/信使###ob娱乐下载
为什么信息需要在两个不同的地方复制?因为在一些云平台上,在ob直播app构建时间,数据库URL可能还不知道,但Doctrine需要知道数据库的引擎来构建它的配置。因此,主机、用户名和密码并不重要。
创建实体类
会议可以用以下几个属性来描述:
- 的城市会议的举办地;
- 的一年会议的;
- 一个国际标志来指示会议是本地的还是国际的(SymfonyLive vs SymfonyCon)。ob娱乐下载
Maker包可以帮助我们生成一个类实体类),表示会议。
现在是时候生成会议
实体:
1
$ob娱乐下载symfony控制台make:实体会议
这个命令是交互式的:它将指导您完成添加所需的所有字段的过程。使用以下答案(其中大部分是默认答案,所以你可以按“Enter”键使用它们):
城市
,字符串
,255
,没有
;一年
,字符串
,4
,没有
;的国际
,布尔
,没有
.
下面是运行该命令时的完整输出:
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 52 53 54
创建:src/Repository/ConferenceRepository.php现在让我们添加一些字段!您可以稍后手动或重新运行此命令添加更多字段。新属性名称(按<返回>停止添加字段):> city字段类型(enter ?查看所有类型)[string]: >字段长度[255]:>该字段在数据库中是否为空(nullable) (yes/no) [no]: > updated: src/Entity/Conference.php添加另一个属性?输入属性名(或按停止添加字段):> year字段类型(Enter ?查看所有类型)[string]: >字段长度[255]:> 4该字段在数据库中可以为空(nullable) (yes/no) [no]: > updated: src/Entity/Conference.php添加另一个属性?输入属性名(或按停止添加字段):> isInternational字段类型(Enter ?查看所有类型)[boolean]: >这个字段在数据库中可以为空(nullable) (yes/no) [no]: > updated: src/Entity/Conference.php添加另一个属性?输入属性名(或按停止添加字段):> Success! Next: When you're ready, create a migration with make:migration
的会议
类存储在应用实体\ \
名称空间。
该命令还产生了一个学说存储库类:App \ Repository \ ConferenceRepository
.
生成的代码如下所示(这里只复制了文件的一小部分):
注意,类本身是一个普通的PHP类,没有Doctrine的标志。属性用于添加对Doctrine有用的元数据,以将类映射到相关的数据库表。
教义增加了id
属性在数据库表中存储该行的主键。此钥匙(ORM \ Id ()
)自动生成(ORM \ GeneratedValue ()
)通过依赖于数据库引擎的策略。
现在,为会议评论生成一个Entity类:
1
$ob娱乐下载symfony控制台make:实体注释
输入以下答案:
作者
,字符串
,255
,没有
;文本
,文本
,没有
;电子邮件
,字符串
,255
,没有
;createdAt
,datetime_immutable
,没有
.
连接实体
会议和评论这两个实体应联系在一起。会议可以有零个或多个注释,这称为注释一对多的关系。
使用:实体
命令将此关系添加到会议
类:
12 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
您的实体已经存在!因此,让我们添加一些新字段!新属性名(按<返回>停止添加字段):> comments字段类型(输入?[string]: > OneToMany这个实体应该与什么类相关?一个新的属性也将被添加到Comment类…注释[conference]中的新字段名:>是注释。会议属性允许为空(可空)?(yes/no) [yes]: > no你想在你的关系上激活orphanRemoval吗?当一条注释从相关的会议中删除时,它就是“孤儿”。注意:如果一个注释可以从一个会议更改到另一个会议,回答“no”。你想自动删除孤立的应用程序\实体\评论对象(orphanRemoval)?(yes/no) [no]: > yes updated: src/Entity/Conference.php updated: src/Entity/Comment.php
请注意
如果你进入?
作为类型的答案,你将得到所有支持的类型:
12 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
在添加关系后,看看实体类的完整差异:
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 @@ class Comment */ private $createdAt;+ #[ORM\ManyToOne(inversedBy: 'comments')]+ #[ORM\JoinColumn(nullable: false)]+私人会议$会议;+公共函数getId(): ?int{返回$this->id;@@ -88,4 +94,16 @@类注释返回$this;}++公共函数getConference():+ {+返回$this->会议;+}++公共功能setConference(?会议$会议):自我+ {+ $this->conference = $conference;++返回$this;+}}——/ src /实体/ Conference.php+ + + b / src /实体/ Conference.php@@ -2,6 +2,8 @@名称空间的应用程序\实体;+使用原则\常见\ \ ArrayCollection集合;+使用原则\常见\集合\集合;使用Doctrine\ORM\Mapping作为ORM;/** @@ -31,6 +33,16 @@班级会议*/ private $isInternational;+ #[ORM\OneToMany(targetEntity: Comment::class, mappedBy: "conference", orphanRemoval: true)]+私人$评论;++公共函数__construct()+ {+ $this->comments = new ArrayCollection();+}+公共函数getId(): ?int{返回$this->id;@@ -71,4 +83,35 @@ class会议返回$this;}++ / * *+ * @返回集合 + * /+公共函数getComments():集合+ {+返回$this->注释;+}++公共函数addComment(Comment $ Comment): self+ {+ if (!$this->comments->contains($comment)) {+ $this->comments[] = $comment;+ $评论- > setConference ($);+}++返回$this;+}++公共函数removeComment(Comment $ Comment): self+ {+ if ($this->comments->contains($comment)) {+ $ this - >评论> removeElement($评论);+ //设置所属端为空(除非已经更改)+ if ($comment->getConference() === $this) {+ $评论- > setConference(空);+}+}++返回$this;+}}
管理关系所需的一切都已为您生成。一旦生成,代码就是你的了;您可以自由地按照您想要的方式定制它。
添加更多属性
我刚刚意识到我们忘记在Comment实体上添加一个属性:与会者可能想要附上一张会议的照片来说明他们的反馈。
运行:实体
再加一次photoFilename
类型的属性/列字符串
,但让它去吧零
因为上传照片是可选的:
1
$ob娱乐下载symfony控制台make:实体注释
迁移数据库
项目模型现在由两个生成的类完整地描述。
接下来,我们需要创建与这些PHP实体相关的数据库表。
教义迁移是这项任务的最佳人选。它已经被安装为orm
依赖。
一个迁移是一个类,它描述将数据库模式从当前状态更新为实体属性定义的新状态所需的更改。由于数据库现在是空的,迁移应该包括两个表的创建。
让我们看看教义产生了什么:
1
$ob娱乐下载Symfony控制台make:迁移
注意输出中生成的文件名(文件名看起来像迁移/ Version20191019083640.php
):
更新生产数据库
迁移生产数据库所需的步骤与您已经熟悉的步骤相同:提交更改并部署。
在部署项目时,Platform.sh会更新代码,但也会运行数据库迁移(如果有的话)原则:迁移:迁移
命令存在)。
要进一步
- 数据库和原则ORM在Syob娱乐下载mfony应用中;
- ob娱乐下载SymfonyCasts学说教程;
- 与教义协会/关系合作;
- DoctrineMigrationsBundle文档.
$ob娱乐下载symfony控制台make:实体会议