この記事は、以下の環境で動作確認しています。
OS: macOS Venture 13.3.1
Chip: Apple M1 Pro
PHP: 8.1.19
Symfony: 5.4.24
参考
以下の公式ドキュメントを参考にしています。
Doctrineのインストール
まずは以下を実行。
symfony composer require symfony/orm-pack
環境によって、依存パッケージのエラーが出力される可能性があります。
Your requirements could not be resolved to an installable set of packages.
各パッケージに必要なバージョンを探索してくれるように--with-all-dependencies
のオプションを付与します。
symfony composer require symfony/orm-pack --with-all-dependencies
MakerBundleのインストール
symfony composer require --dev symfony/maker-bundle
Databaseの構成
symfony/orm-pack
をインストールすると、おそらくdocker-compose.yml
ファイルが自動生成されています。(なければ作成する必要あり。)
デフォルトでpostgres
の構成で記述されているのでPOSTGRES_USER
とPOSTGRES_PASSWORD
のみ任意の値に変更して起動します。
# docker-compose.yml
version: "3"
services:
database:
image: postgres:${POSTGRES_VERSION:-15}-alpine
environment:
POSTGRES_DB: ${POSTGRES_DB:-app}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-password}
POSTGRES_USER: ${POSTGRES_USER:-user}
volumes:
- database_data:/var/lib/postgresql/data:rw
volumes:
database_data:
ドキュメントに記載のように、.env
ファイルも忘れず修正します。
DATABASE_URL="postgresql://user:password@127.0.0.1:5432/app?serverVersion=15&charset=utf8"
コンテナを起動します。
docker-compose up -d
Databaseの作成
Databaseを作成します。
symfony php bin/console doctrine:database:create
ただし、docker-compose up
のタイミングで作成済みの為かエラーが出力されます。
An exception occurred while executing a query: SQLSTATE[42P04]: Duplicate database: 7 ERROR: database "app" already exists
以下コマンドで確認すると、確かに作成されてそう!
docker exec -it container_id psql -U database_user database
問題なさそうなので、Entityの作成に進みます。
Entityクラスの作成
ここはドキュメントに沿ってコマンドを実行し、各設定値もドキュメントに従います。
symfony php bin/console make:entity
マイグレーションファイルの生成と実行
symfony php bin/console make:migration
上記コマンドでマイグレーションファイルが生成されるので、つづけて実行します。
symfony php bin/console doctrine:migrations:migrate
[OK] Successfully migrated to version : DoctrineMigrations\VersionXXX
テーブルが作成できたはずなので、確認します。
docker exec -it container_id psql -U database_user database
もう一度、コンテナに接続して、\dt
や\d product
を実行すると確かに想定通りのテーブルが生成されています。
Column | Type | Collation | Nullable | Default |
---|---|---|---|---|
id | integer | not null | ||
name | character varying(255) | not null | ||
price | integer | not null |
まとめ
テーブル定義に変更があった場合でも、以下の流れは変わりません。
- Entityクラスの作成
- マイグレーションファイルの作成
- マイグレーション実行
コマンドベースでは以下の順序です。
# 1: Entityクラスの作成
symfony php bin/console make:entity
# 2: マイグレーションファイルの作成
symfony php bin/console make:migration
# 3: マイグレーション実行
symfony php bin/console doctrine:migrations:migrate