Die Datenstruktur beschreiben
Die Datenstruktur beschreiben
Um in PHP mit der Datenbank umzugehen, werden wir学说verwenden, eine Reihe von Bibliotheken, die Entwickler* inenhelfen, Datenbanken zu verwalten:原则DBAL (eine datenbank - abstrakations - schicht),原则ORM (eine Bibliothek um unseren Datenbank-Inhalt anzupassen mit Hilfe von php - objkten)和原则迁移。
教条主义
教条主义是怎样的?Das Doctrine-Recipe hat eine konfigationsdatei hinzugefügt,配置/包/ doctrine.yaml
, die das Verhalten steuert。像爱因斯坦一样死去Datenbank-DSN, eine Zeichenkette, die alle Informationen über die Verbindung enthält: Anmeldeinformationen,主机,端口等。Standardmäßig sucht环境变量学说DATABASE_URL
.
快速alle安装Pakete haben eine配置datei im配置/包/
-Verzeichnis。Normalerweise sind die standdeinstellungen so gewählt, dass sie für die meisten Anwendungen funktionieren。
konentionen für Sob娱乐下载ymfony-Environment-Variablen verstehen
杜kannstDATABASE_URL
曼努埃尔.env
——奥得河.env.local
-Datei definieren。丹克食谱,Paketes siehst Du sogar eine beispielhafteDATABASE_URL
在我.env
-Datei。Aber da sich der lokale Port auf PostgreSQL, der von Docker festgelegt wid, ändern kann, ist dieser Weg recht umständlich。我很高兴见到你。
在einer Datei音乐节上的AnstattDATABASE_URL
einzusetzen, können wir alle Befehle mitob娱乐下载
prefixen。Dadurch werden Dienste erkannt, die von Docker und/ order Platform.sh ausgeführt werden (wenn der Tunnel geöffnet ist) und die Environment-Variable wid automatisch gesetzt。
Docker Compose und Platform.sh arbeiten潮湿柴油环境变量nahtlos mit Symfony zusammen。ob娱乐下载
Du überprüfst环境变量指数,indem Duob娱乐下载symfony var:出口
ausfuhrst:
1
$ob娱乐下载symfony var:出口
1 2
DATABASE_URL = postgres: / /主要:main@127.0.0.1:32781 /主要吗?Sslmode =disable&charset=utf8 #…
我有个窝数据库
-Servicenamen, der in den konfigationen von Docker und Platform.sh verwendet ward ?Die Servicenamen werden als Präfixe für环境变量wieDATABASE_URL
verwendet。温迪纳服务中心,symfony - konentionenob娱乐下载 benannt sind, ist, keine weitere配置。
请注意
Datenbanken sinind night der einzige Service, der von voob娱乐下载n symfony - konentionen profit。Das Gleiche gilt z. B. für Mailer (über die Environment-VariableMAILER_DSN
).
Den Standardwert DATABASE_URL在.env ändern
我们会死的.env
- datei dennoch ändern,嗯die Standard-DATABASE_URL
für die Verwendung von PostgreSQL festzulegen:
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娱乐下载
Warum müssen die Informationen an zwei verschiedenen Stellen dupliziert werden?云平台真棒ob直播appZeitpunkt des Buildsdie Datenbank- url möglicherweise noch nicht bekannt ist, muss Doctrine die Engine der Datenbank kennen, um ihre Konfiguration zu erstellen。我的主人和我的朋友。
Entity-Klassen anlegen
Eine Konferenz kann mit einigen wenigen Eigenschaften beschrieben werden:
- 死城市,在der die Konferenz organisiert wid;
- 达斯Jahrder Konferenz;
- 静脉国际-Flag, die angibt, ob die Konferenz lokal oder international ist (ob娱乐下载SymfonyLive vs. SymfonyCon)。
Das Maker-Bundle kann uns helfen, eine Klasse (eineEntity-Klasse) zu generieren, die eine Konferenz repräsentiert。
jetzit ist an der Zeit die会议
-实体zu generieren:
1
$ob娱乐下载symfony控制台make:实体会议
diesel Befehl ist interaktiv: Er führt Dich durch den Prozess des Hinzufügens aller benötigten Felder。Verwende die folgenden Antworten (die meisten davon sind die Standardwerte, Du kannst die Taste "Enter" drücken,嗯sie zu verwenden):
城市
,字符串
,255
,没有
;一年
,字符串
,4
,没有
;的国际
,布尔
,没有
.
Das ist die vollständige Ausgabe des Befehls:
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
死会议
-Klasse wurde under them应用实体\ \
名称空间abgelegt。
“Befehl erzeugte och eine Doctrine”Repository-Klasse:App \ Repository \ ConferenceRepository
.
德国通用代码sieht wie folgt aus:
比奇特,这是我的信条。Mittels Attributen werden Metadaten hinzugefügt, die Doctrine verwendet, um die Klasse der zugehörigen Datenbanktabelle zuzuordnen。
教条主义id
-Property/Spalte hinzugefügt,嗯den Primärschlüssel der Zeile in der Datenbanktabelle zu speichern。diesel Schlüssel (ORM \ Id ()
) wid abhängig vom verwendeten Datenbanksystem automatisch generiert (ORM \ GeneratedValue ()
).
Erzeuge nun eine Entity-Klasse für Konferenzkommentare:
1
$ob娱乐下载symfony控制台make:实体注释
叶状虫:
作者
,字符串
,255
,没有
;文本
,文本
,没有
;电子邮件
,字符串
,255
,没有
;createdAt
,datetime_immutable
,没有
.
实体miteinander verknüpfen
与实体无关,会议与评论。Eine Konferenz kann null oder mehr Kommentare haben,是alsOne-to-Many-Beziehungbezeichnet将。
Verwende erneut den:实体
-Befehl,嗯diese Beziehung zur会议
-Klasse hinzuzufugen:
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
请注意
温杜安草auf den Typ?
eingibst, erhältst Du alle unterstützten打字:
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
Wirf einen Blick auf das vollständige Diff für die Entity-Klassen, nachdem Du die Beziehung(关系)hinzugefügt hast:
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;+}}
Alles,是Du für die Verwaltung von relations benötigst, wurde für Dich generiert。Sobald der Code generiert ist, gehört er Dir;zöger nicht, ihn nach Deinen Wünschen anzupassen。
Weitere Properties (Spalten) hinzufügen
Mir ist gerade aufgefallen, dass wir vergessen haben, ein Property zur Comment-Entity hinzuzufügen: Die Teilnehmer*innen möchten vielleicht ein Foto der Konferenz anhängen, um ihr Feedback zu veranschaulichen。
Fuhre:实体
Noch einmal aus und füge einphotoFilename
属性/Spalte vom类型字符串
Hinzu, aber lass es零
sein, da das Hochladen eines图片可选ist:
1
$ob娱乐下载symfony控制台make:实体注释
Datenbank的移民
Das projektmodelell野生尼姑durch die beiden generierten Klassen vollständig beschrieben。
Als nächstes müssen wir die Datenbanktabellen erstellen, die sich auf diese PHP-Entitys beziehen。
教义迁移ist die perfeckte Ergänzung für eine solche Aufgabe。“那是我的生命”orm
依赖installiert。
风景明信片迁移ist eine Klasse, welche die Änderungen beschreibt, die erforderlich sind, um ein Datenbankschema von seinem aktuellen Zustand auf den neuen Zustand, der durch die属性in den Entities definiert ist, zu aktualisieren。大die Datenbank vorerst leer ist, sollte die Migration auszwei Einträgen bestehen。
Mal sehen是erzeugt教义:
1
$ob娱乐下载Symfony控制台make:迁移
Beachte den generierten Dateinamen in der Ausgabe (in Name, der so aussieht)迁移/ Version20191019083640.php
):
Die lokale Datenbank aktualisieren
Du kannst nun die generierte Migration ausführen, um das lokale Datenbankschema zu aktualisieren:
1
$ob娱乐下载Symfony控制台原则:迁移:迁移
Das lokale Datenbankschema ist nun auf dem aktuellen Stand and bereit, einige Daten zu speichern。
生产数据库
Die Schritte, Die für Die移民der Datenbank für Die Produktivumgebung erforderlich信德,信德Die gleichen wie Die, mit denen Du bereits vertraut bist:委员会的死亡Änderungen和部署。
Beim Deployment des projects aktualisiert Platform.sh den Code, führt aber auch die Datenbankmigration durch, falls vorhanden (Platform.sh erkennt, ob der原则:迁移:迁移
-Befehl existiert)。
Weiterfuhrendes
- Datenbanken和Doctrine ORM在Syob娱乐下载mfony-Anwendungen;
- ob娱乐下载SymfonyCasts学说教程;
- Arbeiten mit教义,协会/关系;
- DoctrineMigrationsBundle Dokumentation.
$ob娱乐下载symfony控制台make:实体会议