Décrire la结构des données
Décrire la结构des données
Pour interagir avec la base de données代理PHP, nous allons nous apppuyer sur学说, unensemble de bibliothèques qui nous aide à gérer les bases de données: Doctrine DBAL (une couche d’abstraction de la base de données), Doctrine ORM (une librairie pour manipuler le contu de notre base de données en utilant des objects PHP), et Doctrine Migrations。
配置主义ORM
评论est-ce que Doctrine est au courant de notre connexion à la base de données ?La recette de Doctrine a ajouté un fichier de configuration qui contrôle son comement:配置/包/ doctrine.yaml
.Le paramètre校长est LeDSN de la base de données, une chaîne内容商号的信息sur la连接:身份,hôte,端口等。Par défaut,研究可变环境的学说DATABASE_URL
.
Presque tous les paquets installés sont configurés dans le répertoire配置/包/
.Les valeurs par défaut ont été choisies avec soin pour functionner avec la plupart des applications。
Symfony环境变量的惯例理解ob娱乐下载
Vous pouvez définir la variableDATABASE_URL
manuelementdans le fichier.env
欧.env.local
.事实,grâce à事实与变数之间的关系DATABASE_URL
dan votre fichier.env
.Mais comme le port exposé par Docker vers PostgreSQL peut change, c'est assz lous。这是一个万无一失的解决方案。
用变量代替编码器DATABASE_URL
Dans UN fichier, nous pouvons préfixer toutes les commandes avecob娱乐下载
.Ceci détectera les services exécutés par Docker et/ou Platform.sh (lorsque le tunnel est ouvert) et définira automatiquement la variable d' environment。
Docker Compose et Platform.sh function parfaitement avec Symfob娱乐下载ony grâce à ces变量d' environment。
Vérifiez toutes les变量d'环境exposées en exécutantob娱乐下载symfony var:出口
:
1
$ob娱乐下载symfony var:出口
1 2
DATABASE_URL = postgres: / /主要:main@127.0.0.1:32781 /主要吗?Sslmode =disable&charset=utf8 #…
Vous rappelez-vous du笔名服务数据库
utilisé dans les configurations Docker et Platform.sh ?Les names des services sont utilisés comme préfixes pour définir des variables d' environment telles queDATABASE_URL
.Si vos services sont nommés selon les conventions ob娱乐下载Symfony, aucune autre configuration n'est nécessaire。
请注意
Les bases de données ne sont pas Les seuls services qui bénéficient des conventions ob娱乐下载Symfony。Il en va de même pour Mailer, par example(通过la variable d' environmentMAILER_DSN
).
修饰符价值值défaut de DATABASE_URL dans le fichier .env
Nous allons quand même change le fichier.env
倒初始化变量DATABASE_URL
pour l'utilisation de 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娱乐下载
Pourquoi l'information doit-elle être dupliquée à deux endroits différents ?云的板块,auob直播appMoment de la编译, l'URL de la base de données n'est peut-être pas encore conue mais Doctrine a besoin de connaître le moteur de la base de données pour初始化器sa配置。Ainsi, l'hôte, le pseudo et le mot de pass n'ont pas vraiment d' important。
Créer des类d'entités
Une conférence peut être décrite en quelques propriétés:
- 拉城镇Où la conférence est organisée;
- L 'annee德拉conférence;
- 一个选项国际pour indiquer si la conférence est locale ou internationale (ob娱乐下载SymfonyLive vs SymfonyCon)。
勒制造商包Peut nous aider à générer une class (une class实体) qui représente une conférence。
最高维护温度générer l'entité会议
:
1
$ob娱乐下载symfony控制台make:实体会议
Cette command est interactive:我是导游,我是导游,我是导游,我是冠军,我是冠军。用我们的钱réponses用我们的钱défaut,用我们的钱Entrée用我们的钱
城市
,字符串
,255
,没有
;一年
,字符串
,4
,没有
;的国际
,布尔
,没有
.
语音la sortie complète lors de l'exécution de la command:
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
洛杉矶的架势会议
été stockée sous le名称空间应用实体\ \
.
La command a également généré une class se de存储库原则:App \ Repository \ ConferenceRepository
.
Le code généré similar à ce qui suit (seule une petite partie du fichier est retranscriprite ici):
Notez que la class elle-même est une class PHP sans aucune référence à Doctrine。Les attribute sont utilisés pour ajouter des métadonnées utiles à Doctrine afin de mapper la classe à sa table associée dans la base de données。
学说a ajouté un属性id
倒stocker la clé primaire de la ligne dans la table de la base de données。Cette clé (ORM \ Id ()
) est générée自动化(ORM \ GeneratedValue ()
) avec une stratégie qui dépend du moteur de base de données。
维护人员,générez une class se d'entité pour les commentaires de la conférence:
1
$ob娱乐下载symfony控制台make:实体注释
Entrez les réponses suivantes:
作者
,字符串
,255
,没有
;文本
,文本
,没有
;电子邮件
,字符串
,255
,没有
;createdAt
,datetime_immutable
,没有
.
Lier les entités
Les deux entités,会议等评论, devraient être liées l'une à l'autre。Une conférence peut avoir zéro commentaire ou plus, ce qui s'appelle Une relation一对多.
Utilisez à nouveau la command:实体
倒ajouter cette关系à la类会议
:
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
请注意
请进?
Comme réponse pour le type, vous obtiendrez tous les types pris en charge:
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
Jetez un coup d'oeil audiff完整的entre les classes d'entités après l'ajout de la关系:
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;+}}
Tout ce don don vous avez besoin pour gérer la relation a été généré pour vous。Une fois généré, le code devient le vôtre;N 'hésitez pas à le personnaliser comme vous le souhaitez。
阿约特·达尔特propriétés
Je viens de réaliser que nous avons oublié d'ajouter une propriété sur l'entité评论: une photo de la conférence peut être jointe afin d'illustrer UN retour d'expérience。
Exécutez à nouveau:实体
Et ajoutez une propriété/colonnephotoFilename
德式字符串
.Mais, comme l'ajout d'une photo est faculty, permettez-lui d'être零
:
1
$ob娱乐下载symfony控制台make:实体注释
Migrer la base de données
La structure du project est maintenant entièrement décrite par les deux classes générées。
Ensuite, nous devons créer les tables de base de données liées à ces entités PHP。
教义迁移Est la solution idéale pour cela。Le paquet a déjà été installé dans Le cadre de la dépendanceorm
.
一个迁移Est une classse qui décrit les changements nécessaires pour mettre à jour UN schéma de base de données, de son état actuel vers le nouveau, en function des attributs de l'entité。Comme la base de données est vide pour l'instant, la migration devrait consister en la création de deux tables。
航海主义génère:
1
$ob娱乐下载Symfony控制台make:迁移
Notez le nom du fichier généré (un nom qui similar à迁移/ Version20191019083640.php
):
Mettre à jour la base de données locale
Vous pouvez maintenant exécuter la migration générée pour mettre à jour le schéma de la base de données现场环境:
1
$ob娱乐下载Symfony控制台原则:迁移:迁移
Le schéma de la base de données locale est à jour à présent, prêt à stocker des données。
Mettre à jour la base de données de production
Les étapes nécessaires à la migration de la base de données de production sont Les mêmes que celles que vous conaissez déjà:提交Les changements et déployer。
Lors du déploiement du projet, Platform.sh meet à jour le code, mais exécute également la migration de la base de données si nécessaire (il détecte si la command原则:迁移:迁移
存在)。
Aller加腰
$ob娱乐下载symfony控制台make:实体会议