デ,タ構造の説明
デ,タ構造の説明
PHPからデタベスを扱うのに,デタベス運用に便利なラブラリの学说を使用しましょう:教义DBAL(データベース抽象化レイヤ),教义ORM (PHPのオブジェクトを使ってデータベース上のデータを更新するライブラリ),そして教义迁移があります。
教义ORMの設定
教义はどのようにデ,タベ,ス接続に関して知るのでしょうか?教义のレシピは配置/包/ doctrine.yml
という設定ファ@ @ルに必要な情報を書き込んでいます。主な設定項目は,主机クレデンシャルや,端口などの接続に関する情報を含んだ文字列であるデ,タベ,スのdsnです。デフォルトでは,教义は,DATABASE_URL
環境変数を探すようになっています。
ほとんど全てのンストル済みパッケジは,配置/包/
ディレクトリ内に設定ファ@ @ルがあります。大抵の場合,デフォルト値は,ほとんどのアプリケ,ションで動作するよう,慎重に設定されています。
ob娱乐下载Symfonyの環境変数の規約を理解する
.env
や.env.local
ファ@ @ルに手動でDATABASE_URL
を定義することもできます。実際,パッケ,ジのレシピを使うことで,.env
ファ@ @ル内にDATABASE_URL
がサンプルが書かれていますので確認してください。しかし,码头工人がPostgreSQLのローカルポートは変えることがありますので,少し面倒なときもあります。そんなときのために,より良い方法があります。
ファ@ @ル内にDATABASE_URL
をハ,ドコ,ドするのではなく,全てのコマンドにob娱乐下载
の接頭辞をけることができます。このことによって码头工人やPlatform.sh(トンネルが開いていれば)で動いているサービスを検知し,環境変数を自動的に設定してくれます。
これらの環境変数を使うことで码头工人组成と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
のような環境変数を定義の接頭辞として使われます。ob娱乐下载Symfonyの規約に沿ってサ,ビスが命名されていれば,特に設定は必要ありません。
请注意
ob娱乐下载Symfonyの規約による利点は,データベースのサービスのみではなく,メーラーなどにもあります(環境変数MAILER_DSN
)
.envのデフォルトのDATABSE_URLの値を変更する
.env
ファaapl . exeルを変更して,PostgreSQLを使うためのデフォルトのDATABASE_URL
をセットアップしましょう:
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娱乐下载
なぜ別の場所に重複した情報を設定する必要があるのでしょうか?クラウドによってはビルド時にデータベースのURLがわからないものもあり,教义が設定情報のために,データベースエンジンを知る必要があるからです。ホスト名やユ,ザ,名,パスワ,ドは知る必要はありません。
エンティティクラスを作成する
会议オブジェクトはプロパティで記述することができます:
- 城市はカンファレンスの開催場所です;
- 一年は,カンファレンスの開催年です;
- 国际フラグは,カンファレンスがローカルイベントなのか国際イベントなのかを表します(ob娱乐下载SymfonyLive vs SymfonyCon)。
创客バンドルで大会を表現するためのエンティティクラスを生成することができます。
さあ会议
エンティティを作りましょう:
1
$ob娱乐下载symfony控制台make:实体会议
このコマンドはインタラクティブに動きます:全ての必要なフィールドを追加することを補助してくれます。以下のように答えましょう(ほとんどはデフォルトで,ただ”エンター”キーを押すだけで良いはずです):
城市
,字符串
,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クラスです。学说のアトリビュートを使うことで、関連するデータベースのテーブルとのマッピングをすることができます。
教义は,デタベスのテブルのプラマリキとして使用するid
プロパティを追加します。このキ(ORM \ Id ()
)は,デ,タベ,スエンジンによって自動的に生成されます(ORM \ GeneratedValue ()
)。
カンファレンスのコメントのエンティティクラスを生成しましょう:
1
$ob娱乐下载symfony控制台make:实体注释
次の回答を入力してください:
作者
,字符串
,255
,没有
;文本
,文本
,没有
;电子邮件
,字符串
,255
,没有
;createdAt
,datetime_immutable
,没有
.
エンティティ間の関連付け
カンファレンスとコメントのエンティティは連携する必要があります。カンファンレスはn個のコメントを持ますので,一对多の関連となります。
会议
クラスにリレ,ションを追加するために,:实体
コマンドをもう一度使いましょう:
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
リレ,ションを追加した前後のエンティティクラスの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 @@ 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;+}}
リレ,ションに必要な全ては生成されました。生成されたコドは自由に編集してカスタマズできます。
さらにプロパティを追加する
コメントエンティティにもう一つプロパティを追加するのを忘れていました:参加者はフィードバックとしてカンファレンスの写真を添付するかもしれません。
:实体
をもう一度実行し,photoFilename
プロパティ/カラムを追加しましょう。字符串
タ电子邮箱プですが,写真はオプショナルですので,零
を許容できるようにしましょう:
1
$ob娱乐下载symfony控制台make:实体注释
デタベスのマグレション
これで,2の生成されたクラスでプロジェクトのモデルを記述できました。
次に,これらのPHPのエンティティに関連するデ,タベ,スのテ,ブルを作成する必要があります。
そのニ,ズには,教义迁移が使えます。orm
を▪▪ンスト▪▪ルした際に一緒に入っています。
マ▪▪グレ▪▪ションは,データベーススキーマをエンティティアトリビュートで定義した新しい状態に更新するのに必要な変更を記述するクラスです。まだデータベースに何も作成していないので,マイグレーションは,テーブルを2つ作成することになります。
教义の生成物を見てみましょう:
1
$ob娱乐下载Symfony控制台make:迁移
生成されたファescル名が出力されます(迁移/ Version20191019083640.php
のような名前のファ电子邮箱ル):
ロ,カルデ,タベ,スの更新
これで,生成されたマグレションを走らせてロカルのデタベススキマを更新することができます
1
$ob娱乐下载Symfony控制台原则:迁移:迁移
これでロ,カルのデ,タベ,ススキ,マは最新になりましたので,値を入れる準備ができました。
本番のデ,タベ,スを更新する
本番のデータベースのマイグレーションに必要なステップは,既にやった内容と同じです:コミットして変更をデプロイするのみです。
プロジェクトをデプロイすると,Platform.shはコードを更新し,必要であればデータベースマイグレーションを実行します(原则:迁移:迁移
コマンドがあるかを検知します)。
より深く学ぶために
- 数据库とDoctrine ORMob娱乐下载Symfonyアプリケ,ション;
- ob娱乐下载SymfonyCasts Doctrineチュ,トリアル;
- 教义协会/关系を使用する;
- DoctrineMigrationsBundleのドキュメント.
$ob娱乐下载symfony控制台make:实体会议