Zenn
Open6

Laravel11 のmigrationの仕組み

techno.kokitechno.koki

chat gptに聞いてみた

boku:

laravel11におけるマイグレーションの仕組みを聞きたい
スキーマファイルの役割を教えて

techno.kokitechno.koki

chat gpt:

Laravel 11 におけるマイグレーションの仕組み

Laravel 11では、マイグレーションは以前のバージョンと同様に、データベーススキーマをバージョン管理する仕組みです。ただし、スキーマファイル(schema file) という新しい仕組みが導入されており、従来のマイグレーションファイルの管理を簡素化できます。


スキーマファイル(schema file)の役割

Laravel 11では、database/schema ディレクトリに スキーマファイルschema.json など)を保存できます。このファイルの主な役割は、データベースの現在のスキーマのスナップショットを保存することです。

スキーマファイルのメリット

  1. 従来のマイグレーション履歴が不要になる

    • Laravel 10までは、すべてのマイグレーションファイルを順番に適用する必要がありました。
    • Laravel 11では、スキーマファイルがあると php artisan migrate 実行時にこのスキーマを直接適用できるため、過去のマイグレーションを保持する必要がなくなります。
  2. マイグレーションの適用が高速化

    • マイグレーションファイルを1つずつ実行するのではなく、スキーマファイルを元に 一括適用 できるため、新規セットアップ時に時間を短縮できます。
  3. マイグレーションファイルの管理がシンプルになる

    • マイグレーションが増えすぎると、管理が大変になるが、スキーマファイルを使えば、シンプルな形でスキーマを保持できる。

スキーマファイルの作成と適用

1. スキーマファイルの作成

以下のコマンドで現在のデータベーススキーマをスキーマファイルとして保存できます。

php artisan schema:dump

これにより、database/schema にスキーマファイルが作成されます。

2. スキーマファイルを使ったマイグレーション

新しい環境で、スキーマファイルを基にデータベースを作成する場合は、通常のマイグレーションコマンドを実行するだけです。

php artisan migrate

スキーマファイルが存在すれば、それを基にデータベースを作成します。

3. スキーマファイルを使用しない場合

従来のマイグレーションファイルを使ってマイグレーションすることも可能です。

php artisan migrate --path=database/migrations

まとめ

  • Laravel 11ではスキーマファイル (database/schema/schema.json など) が導入された。
  • php artisan schema:dump でスキーマファイルを作成できる。
  • php artisan migrate 実行時にスキーマファイルが優先され、過去のマイグレーション履歴が不要になる。
  • スキーマファイルを使うことで、新しい環境でのセットアップが高速化&簡単になる。

従来のマイグレーションとの互換性もあるので、必要に応じて使い分けると良いですね。

techno.kokitechno.koki

boku:

php artisan migrate 実行時にスキーマファイルが優先され、過去のマイグレーション履歴が不要になる。

これはどういうこと?

techno.kokitechno.koki

chat gpt

php artisan migrate 実行時の挙動(Laravel 11)

Laravel 11では、php artisan migrate を実行すると、まずスキーマファイル(database/schema にあるもの)が存在するかどうかを確認します。スキーマファイルが存在すれば、それを基にデータベースを作成し、マイグレーション履歴(migrations テーブル)にスキーマ適用済みの状態を記録します。

従来のLaravelのマイグレーションの流れ

  1. database/migrations にあるマイグレーションファイルを一つずつ実行。
  2. migrations テーブルに適用済みのマイグレーションを記録。
  3. php artisan migrate 実行時は、未適用のマイグレーションを探して実行。

Laravel 11 のスキーマファイルがある場合

  1. database/schema/ 内のスキーマファイルを直接適用(例: schema.json)。
  2. migrations テーブルに「このスキーマファイルを適用済み」と記録。
  3. その後、新しいマイグレーションファイルがあれば、それだけを実行。

つまり、スキーマファイルを利用することで、過去のマイグレーションファイルをすべて適用する手間を省ける ということです。


具体的な動作の流れ

ケース 1: スキーマファイルなし(従来の方法)

  • php artisan migrate を実行すると、database/migrations/ 内のマイグレーションを一つずつ実行する。

ケース 2: スキーマファイルあり

  • php artisan migrate を実行すると、スキーマファイルを基に 一括でデータベースを復元
  • その後、新しいマイグレーションファイルがあれば、それだけ適用。

スキーマファイルのメリット

  1. 新規環境のセットアップが高速化

    • 例えば、過去に100個のマイグレーションを作成していた場合、従来の方法ではそれをすべて適用する必要があった。
    • しかし、スキーマファイルがあれば、1つのファイルから一気にデータベースを作成 できるため、セットアップが高速になる。
  2. マイグレーション履歴を管理する必要がなくなる

    • Laravel 10以前では、新しい環境でマイグレーションを実行する際、migrations テーブルが空の状態から過去のマイグレーションを適用していた。
    • Laravel 11では、スキーマファイルを適用すると、それまでのマイグレーションは適用済みとして扱われる ため、過去のマイグレーションファイルを削除できる。
  3. 本番環境でのデプロイが簡単に

    • 本番環境のデータベースをセットアップする際、従来はマイグレーションをすべて適用する必要があったが、スキーマファイルを使えばスナップショットから即座に復元できる。

1. スキーマファイルを作成

開発が進んでマイグレーションが増えてきたら、以下のコマンドでスキーマファイルを作成する。

php artisan schema:dump

これにより、database/schema/ にスキーマファイル(例: schema.json)が作成される。

2. 新しい環境でデータベースをセットアップ

本番環境や新しい開発環境で php artisan migrate を実行すると、以下の流れになる。

  • Laravel は database/schema/ のスキーマファイルを適用。
  • migrations テーブルに「スキーマファイル適用済み」と記録。
  • その後、新規のマイグレーションファイルがある場合、それだけを適用。

まとめ

  • Laravel 11の php artisan migrate は、スキーマファイルがある場合、それを優先適用する
  • 過去のマイグレーション履歴が不要になり、データベースのセットアップが高速化
  • スキーマファイル適用後、新しいマイグレーションだけを追加適用 する仕組み。
  • スキーマファイルを利用することで、マイグレーションファイルの管理がシンプルに

この仕組みを使うと、新しい環境でのセットアップがスムーズになり、開発スピードが向上するね!

techno.kokitechno.koki

boku

php artisan migrate --path=database/migrations

このようにpathを指定するとどうなるの?
スキーマファイルは絶対に適用されない?

techno.kokitechno.koki

chat gpt

php artisan migrate --path=database/migrations の挙動

このコマンドを実行すると、Laravel は スキーマファイルを無視して、指定されたパス内のマイグレーションファイルのみを適用 します。

具体的な動作

  • --path=database/migrations を指定すると、スキーマファイルは 絶対に適用されない
  • database/migrations/ にあるマイグレーションファイルを、従来の方法と同じく一つずつ実行する。
  • migrations テーブルには、各マイグレーションが適用された履歴が記録される。

スキーマファイルと --path オプションの関係

コマンド スキーマファイルの適用 マイグレーションの適用
php artisan migrate スキーマファイルが優先適用(存在する場合) スキーマ適用後、新しいマイグレーションのみ実行
php artisan migrate --path=database/migrations スキーマファイルは適用されない すべてのマイグレーションを順番に実行

どんな場合に --path=database/migrations を使うべきか?

  1. スキーマファイルを使わず、従来のマイグレーションを手動で適用したいとき

    • 例えば、スキーマファイルを作成していない、またはスキーマファイルの内容が信用できない場合。
  2. 特定のマイグレーションファイルのみを実行したいとき

    • 例えば、ある特定の機能に関連するマイグレーションだけを適用したい場合:
      php artisan migrate --path=database/migrations/2024_03_27_123456_create_users_table.php
      
    • これにより、指定したファイルのみが実行される。
  3. スキーマファイルを適用せず、すべてのマイグレーションを一からやり直したいとき

    • 例えば、新しい環境でスキーマファイルを使わず、初期マイグレーションから順に適用する場合。

まとめ

php artisan migrate → スキーマファイルを 優先適用(存在すれば)
php artisan migrate --path=database/migrationsスキーマファイルを無視 してマイグレーションを一つずつ適用

なので、スキーマファイルを使いたくない場合は --path オプションを使うといいですね。

ログインするとコメントできます