Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

【Symfony4】Doctrineマイグレーションコマンドまとめ

More than 3 years have passed since last update.

前置き

  • インストールやDB接続設定はSymfony4を想定
  • DoctrineコマンドはSymfony4でなくても使用可能
  • Symfony2では bin/console ではなく app/console

Doctrineのインストール

$ composer require doctrine

DB接続設定

.env
# この行を環境に合わせて修正する
DATABASE_URL="mysql://db_user:db_password@127.0.0.1:3306/db_name"

DBの作成

以下のコマンドを使うと .env の接続設定で指定した db_name のデータベースを作成する。

$ php bin/console doctrine:database:create

Doctrineコマンド一覧表示

$ php bin/console list doctrine

コマンドごとのヘルプを表示

$ php bin/console doctrine:database:create --help

Entityクラスを作成

例えば、以下のようにすると src/Entity/Product.php が作成される。

$ php bin/console make:entity Product

src/Entity/Product.php の中身はこのような感じ。

src/Entity/Product.php
// 一部のみ記載
// ...

/**
 * @ORM\Entity(repositoryClass="App\Repository\ProductRepository")
 */
class Product
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;

    // add your own fields
}

Entityクラスからマイグレーションファイルを作成

src/Entity/Product.php にプロパティを追加、それをベースにマイグレーションファイルを作成する。

まずは例として、 $name プロパティを追加する。

src/Entity/Product.php
// 一部のみ記載
// ...

class Product
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=100)
     */
    private $name;
}

プロパティを追加したら以下のコマンドでマイグレーションファイルを作成する。

$ php bin/console doctrine:migrations:diff

コマンドが成功すると src/Migrations/ にマイグレーションファイルが作成される。

マイグレーションを実行する

$ php bin/console doctrine:migrations:migrate

これで product テーブルがDBに作成される。

また、Entityクラスにプロパティを追加するたびに、diff を叩いてマイグレーションファイルを作成し、 migrate でマイグレーションを実行すれば、プロパティに対応したカラムを追加することができる。

なお、マイグレーション実行後は、DBに migration_versions テーブルが作成される。

マイグレーション前の状態に戻す

$ php bin/console doctrine:migrations:execute 20171210142949 --down

バージョンは、後述する doctrine:migrations:status でも確認可能。

マイグレーションの状態を確認する

$ php bin/console doctrine:migrations:status

適用済み・未適用のマイグレーションなどが確認できる。
マイグレーションがおかしくなったときの確認にも役立つ。

空のマイグレーションファイルを作成する

$ php bin/console doctrine:migrations:generate

Entityクラスから作成せずに、空のマイグレーションファイルを作成して、適用するテーブル操作を直接書き込むこともできる。

マイグレーションファイルには up メソッドと down メソッドが用意されており、この中にテーブル操作処理を記述することになる。
up メソッドは doctrine:migrations:migrate したときに実行され、 down メソッドは doctrine:migrations:execute --down したときに実行される。

マイグレーション実行をテストしてみる

--dry-run オプションを付与することで、マイグレーションを実行すると適用されるSQLを確認できる。
マイグレーション自体は行われない。

$ php bin/console doctrine:migrations:migrate --dry-run

実行確認されないようにする

--no-interaction オプションを付与すると、実行前に確認されることなくマイグレーションが始まる。
自動化する際に便利。

$ php bin/console doctrine:migrations:migrate --no-interaction

マイグレーションの履歴を削除する

$ php bin/console doctrine:migrations:version 20171210142949 --delete

マイグレーションがおかしくなってしまった場合などに試してみると良い。

ドキュメント

route06
DXに関する戦略コンサルティング/デジタルプロダクト開発/データプラットフォーム統合などのご支援をさせていただいております。 2020年5月に資金調達をし、本格的に動き出したところで、全職種募集しています。フルリモートワークで全国各地から働けます。ご興味・ご関心のある方がいらっしゃいましたら、お気軽にご連絡ください。現在はカジュアル面談大歓迎です!
https://jobs.route06.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away