Laravelでデータベースセットアップを抽象化するためにデータベース移行とシーダーを使用する方法
Migrationsおよびseedersは、 Laravel PHPフレームワークによって提供される強力なデータベースユーティリティであり、開発者はアプリケーションのデータベースをすばやくブートストラップ、破棄、および再作成できます。 これらのユーティリティは、同じアプリケーションで作業している複数の開発者で発生する可能性のあるデータベースの不整合の問題を最小限に抑えるのに役立ちます。新しい寄稿者は、いくつかのartisan
コマンドを実行するだけで、データベースを新規インストールでセットアップできます。
このガイドでは、移行とシーダーを作成して、Laravelデモアプリケーションのデータベースにサンプルデータを入力します。 最後に、artisan
コマンドのみを使用して、データベーステーブルを何度でも破棄および再作成できます。
前提条件
このガイドに従うには、次のものが必要です。
- sudo権限を持つ非rootユーザーとしてUbuntu18.04ローカルマシンまたは開発サーバーにアクセスします。 リモートサーバーを使用している場合は、アクティブなファイアウォールをインストールすることをお勧めします。 これらを設定するには、 Ubuntu18.04の初期サーバー設定ガイドを参照してください。
- Ubuntu 18.04にDockerをインストールして使用する方法のステップ1およびステップ2に従って、サーバーにDockerをインストールします。
- Ubuntu 18.04にDockerComposeをインストールする方法のステップ1に従って、サーバーにDockerComposeをインストールします。
注:このガイドでは、Docker Composeによって管理されるコンテナー化された開発環境を使用してアプリケーションを実行しますが、LEMPサーバーでアプリケーションを実行することもできます。 これを設定するには、 Ubuntu18.04でLEMPを使用してLaravelをインストールおよび構成する方法に関するガイドに従ってください。
ステップ1—デモアプリケーションを入手する
開始するには、デモLaravelアプリケーションをGitHubリポジトリからフェッチします。 tutorial-02
ブランチに関心があります。これには、コンテナーでアプリケーションを実行するためのDockerComposeセットアップが含まれています。 この例では、アプリケーションをホームフォルダーにダウンロードしますが、任意のディレクトリを使用できます。
cd ~ curl -L https://github.com/do-community/travellist-laravel-demo/archive/tutorial-2.0.1.zip -o travellist.zip
アプリケーションコードを.zip
ファイルとしてダウンロードしたため、解凍するにはunzip
コマンドが必要です。 最近行っていない場合は、マシンのローカルパッケージインデックスを更新します。
sudo apt update
次に、unzip
パッケージをインストールします。
sudo apt install unzip
その後、アプリケーションのコンテンツを解凍します。
unzip travellist.zip
次に、簡単にアクセスできるように、解凍したディレクトリの名前をtravellist-demoに変更します。
mv travellist-laravel-demo-tutorial-2.0.1 travellist-demo
次のステップでは、.env
構成ファイルを作成してアプリケーションをセットアップします。
ステップ2—アプリケーションの.env
ファイルを設定する
Laravelでは、.env
ファイルを使用して、環境に依存する構成をセットアップします。たとえば、クレデンシャルやデプロイメント間で異なる可能性のある情報などです。 このファイルはリビジョン管理に含まれていません。
警告:環境構成ファイルには、データベースの資格情報やセキュリティキーなど、サーバーに関する機密情報が含まれています。 そのため、このファイルを公に共有しないでください。
.env
ファイルに含まれる値は、config
ディレクトリにある通常の構成ファイルに設定されている値よりも優先されます。 新しい環境にインストールするたびに、データベース接続設定、デバッグオプション、アプリケーションURLなど、アプリケーションを実行している環境によって異なる項目を定義するために、調整された環境ファイルが必要です。
travellist-demo
ディレクトリに移動します。
cd travellist-demo
次に、新しい.env
ファイルを作成して、セットアップする開発環境の構成オプションをカスタマイズします。 Laravelにはexample.env
ファイルが付属しており、これをコピーして独自のファイルを作成できます。
cp .env.example .env
nano
または選択したテキストエディタを使用して、このファイルを開きます。
nano .env
.env
ファイルは次のようになります。
.env
APP_NAME=Travellist APP_ENV=dev APP_KEY= APP_DEBUG=true APP_URL=http://localhost:8000 LOG_CHANNEL=stack DB_CONNECTION=mysql DB_HOST=db DB_PORT=3306 DB_DATABASE=travellist DB_USERNAME=travellist_user DB_PASSWORD=password …
travellist
デモアプリケーションの現在の.env
ファイルには、このシリーズの最後のパートでDockerComposeを使用して作成したコンテナー化された環境を使用するための設定が含まれています。 これらの値を変更する必要はありませんが、必要に応じてDB_DATABASE
、DB_USERNAME
、DB_PASSWORD
を自由に変更できます。これらは、[ X155X] ファイルを自動的に作成して、開発データベースをセットアップします。 DB_HOST
変数は、Docker Compose環境内のデータベースサービスの名前を参照しているため、変更されていないことを確認してください。
ファイルに変更を加えた場合は、必ずCTRL + X
、Y
、ENTER
の順に押してファイルを保存して閉じてください。
注: LEMP サーバーでアプリケーションを実行することを選択した場合は、DB_HOST
など、独自のデータベース設定を反映するように強調表示された値を変更する必要があります。 ] 変数。
ステップ3—Composerを使用したアプリケーションの依存関係のインストール
次に、PHPの依存関係管理ツールである Composer を使用して、アプリケーションの依存関係をインストールし、artisan
コマンドを実行できることを確認します。
次のコマンドを使用して、DockerCompose環境を起動します。 これにより、app
サービスのtravellist
イメージが構築され、nginx
およびdb
サービスに必要な追加のDockerイメージがプルされて、アプリケーション環境:
docker-compose up -d
OutputCreating network "travellist-demo_travellist" with driver "bridge" Building app Step 1/11 : FROM php:7.4-fpm ---> fa37bd6db22a Step 2/11 : ARG user ---> Running in 9259bb2ac034 … Creating travellist-app ... done Creating travellist-nginx ... done Creating travellist-db ... done
この操作は、完了するまでに数分かかる場合があります。 プロセスが終了したら、Composerを実行してアプリケーションの依存関係をインストールできます。
app
サービスコンテナでcomposer
およびその他のコマンドを実行するには、docker-compose exec
を使用します。 exec
コマンドを使用すると、DockerComposeによって管理されているコンテナーで任意のコマンドを実行できます。 次の構文を使用します:docker-compose exec service_name command
。
注:LEMPサーバーを使用してデモアプリケーションを実行することを選択した場合は、このガイド全体にリストされているコマンドのdocker-compose exec app
部分を無視する必要があります。 たとえば、次のコマンドを記述どおりに実行する代わりに、次のコマンドを実行するだけです。
composer install
app
コンテナでcomposer install
を実行するには、次のコマンドを実行します。
docker-compose exec app composer install
OutputLoading composer repositories with package information Installing dependencies (including require-dev) from lock file Package operations: 85 installs, 0 updates, 0 removals - Installing doctrine/inflector (1.3.1): Downloading (100%) - Installing doctrine/lexer (1.2.0): Downloading (100%) - Installing dragonmantank/cron-expression (v2.3.0): Downloading (100%) …
Composerがアプリケーションの依存関係のインストールを完了すると、artisan
コマンドを実行できるようになります。 アプリケーションがデータベースに接続できることをテストするには、次のコマンドを実行して、既存のテーブルをクリーンアップします。
docker-compose exec app php artisan db:wipe
このコマンドは、構成されたデータベース上の既存のテーブルをすべて削除します。 正常に実行され、アプリケーションがデータベースに接続できる場合は、次のような出力が表示されます。
OutputDropped all tables successfully.
Composerを使用してアプリケーションの依存関係をインストールしたので、artisan
ツールを使用して移行とシーダーを作成できます。
ステップ4—データベース移行の作成
Laravelに同梱されているartisan
コマンドラインツールには、アプリケーションの管理と新しいクラスのブートストラップに使用できる一連のヘルパーコマンドが含まれています。 新しい移行クラスを生成するには、次のようにmake:migration
コマンドを使用できます。
docker-compose exec app php artisan make:migration create_places_table
Laravelは、実行される操作(create
)、テーブルの名前(places
)、およびこの移行によって新しいテーブルが作成されるかどうかを、提供された説明的な名前に基づいて推測します。 make:migration
コマンド。
次のような出力が表示されます。
OutputCreated Migration: 2020_02_03_143622_create_places_table
これにより、アプリケーションのdatabase/migrations
ディレクトリに新しいファイルが生成されます。 自動生成されたファイルに含まれるタイムスタンプは、移行を実行する順序を決定するためにLaravelによって使用されます。
選択したテキストエディタを使用して、生成された移行ファイルを開きます。 強調表示された値を独自の移行ファイル名に置き換えることを忘れないでください。
nano database/migrations/2020_02_03_143622_create_places_table.php
生成された移行ファイルには、CreatePlacesTable
というクラスが含まれています。
database / migrations / 2020_02_03_143622_create_places_table.php
<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreatePlacesTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('places', function (Blueprint $table) { $table->bigIncrements('id'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('places'); } }
このクラスには、up
とdown
の2つのメソッドがあります。 どちらの方法にもブートストラップコードが含まれており、移行を実行したときに何が起こるか、またロールバックしたときに何が起こるかをカスタマイズするために拡張できます。
up
メソッドを変更して、places
テーブルが現在のアプリケーションのバージョンですでに使用している構造を反映するようにします。
id
:主キーフィールド。name
:場所の名前。visited
:この場所がすでに訪問されたかどうか。
Laravelスキーマビルダーは、データベース内のテーブルを作成、更新、削除するためのメソッドを公開しています。 Blueprint
クラスはテーブルの構造を定義し、各テーブルフィールドの定義を抽象化するためのいくつかのメソッドを提供します。
自動生成されたコードは、id
と呼ばれるプライマリIDフィールドを設定します。 timestamps
メソッドは、2つのdatetime
フィールドを作成します。これらのフィールドは、データがそのテーブル内に挿入または更新されると、基になるデータベースクラスによって自動的に更新されます。 これらに加えて、name
フィールドとvisited
フィールドを含める必要があります。
name
フィールドはstring
タイプになり、visited
フィールドはboolean
タイプに設定されます。 また、visited
フィールドにデフォルト値0
を設定します。これにより、値が渡されない場合は、その場所がまだ訪問されていないことを意味します。 up
メソッドは次のようになります。
database / migrations / 2020_02_03_143622_create_places_table.php
… public function up() { Schema::create('places', function (Blueprint $table) { $table->bigIncrements('id'); $table->string('name', 100); $table->boolean('visited')->default(0); $table->timestamps(); }); } …
注:利用可能な列タイプの完全なリストは、Laravelのドキュメントにあります。
独自の移行スクリプトに強調表示された2行を含めたら、ファイルを保存して閉じます。
これで、artisan migrate
を介して移行を実行する準備が整いました。 ただし、それは空のテーブルを作成するだけです。 また、開発とテストのためにサンプルデータを挿入できる必要があります。 次のステップでは、データベースシーダーを使用してこれを行う方法を説明します。
ステップ5—データベースシーダーの作成
seeder は、サンプルデータ(シード)を生成してデータベースに挿入するために使用される特別なクラスです。 これは、データベースを再作成するたびに手動で挿入する必要があるサンプル値を使用して、新しいデータベースでアプリケーションを再作成できるため、開発環境で重要な機能です。
次に、artisan
コマンドを使用して、PlacesTableSeeder
という名前のplaces
テーブルの新しいシーダークラスを生成します。
docker-compose exec app php artisan make:seeder PlacesTableSeeder
このコマンドは、database/seeds
ディレクトリ内にPlacesTableSeeder.php
という名前の新しいファイルを作成します。 選択したテキストエディタを使用してそのファイルを開きます。
nano database/seeds/PlacesTableSeeder.php
自動生成されたPlacesTableSeeder.php
ファイルは次のようになります。
database / seeds / PlacesTableSeeder.php
<?php use Illuminate\Database\Seeder; class PlacesTableSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { // } }
新しいシーダークラスには、run
という名前の空のメソッドが含まれています。 このメソッドは、db:seed
Artisanコマンドが実行されたときに呼び出されます。
データベースにサンプルデータを挿入するための命令を含めるには、run
メソッドを編集する必要があります。 Laravelクエリビルダーを使用してこのプロセスを合理化します。
Laravelクエリビルダーは、データの挿入、更新、削除、取得などのデータベース操作のための流暢なインターフェースを提供します。 また、SQLインジェクション攻撃に対する保護手段も紹介します。 クエリビルダーは、DB
facade (サービスコンテナー内の基盤となるデータベースクラスへの静的プロキシ)によって公開されます。
まず、静的クラス変数を作成して、データベースに配列として挿入するすべてのサンプルの場所を保持します。 これにより、foreach
ループを使用してすべての値を反復処理し、クエリビルダーを使用して各値をデータベースに挿入できます。
この変数を$places
と呼びます。
database / seeds / PlacesTableSeeder.php
<?php use Illuminate\Database\Seeder; class PlacesTableSeeder extends Seeder { static $places = [ 'Berlin', 'Budapest', 'Cincinnati', 'Denver', 'Helsinki', 'Lisbon', 'Moscow', 'Nairobi', 'Oslo', 'Rio', 'Tokyo' ]; …
次に、コード全体でDB
ファサードを参照しやすくするために、PlacesTableSeeder
クラスの先頭にuse
ステートメントを含める必要があります。
database / seeds / PlacesTableSeeder.php
<?php use Illuminate\Database\Seeder; use Illuminate\Support\Facades\DB; class PlacesTableSeeder extends Seeder …
これで、foreach
ループを使用して$places
配列値を反復処理し、クエリビルダーを使用して各値をplaces
テーブルに挿入できます。
database / seeds / PlacesTableSeeder.php
… public function run() { foreach (self::$places as $place) { DB::table('places')->insert([ 'name' => $place, 'visited' => rand(0,1) == 1 ]); } }
foreach
ループは、$places
静的配列の各値を繰り返し処理します。 各反復で、DB
ファサードを使用して、places
テーブルに新しい行を挿入します。 name
フィールドを、$places
配列から取得した場所の名前に設定し、visited
フィールドを[のいずれかのランダムな値に設定します。 X158X]または1
。
これは、すべての更新後の完全なPlacesTableSeeder
クラスの外観です。
database / seeds / PlacesTableSeeder.php
<?php use Illuminate\Database\Seeder; use Illuminate\Support\Facades\DB; class PlacesTableSeeder extends Seeder { static $places = [ 'Berlin', 'Budapest', 'Cincinnati', 'Denver', 'Helsinki', 'Lisbon', 'Moscow', 'Nairobi', 'Oslo', 'Rio', 'Tokyo' ]; /** * Run the database seeds. * * @return void */ public function run() { foreach (self::$places as $place) { DB::table('places')->insert([ 'name' => $place, 'visited' => rand(0,1) == 1 ]); } } }
これらの変更が完了したら、ファイルを保存して閉じます。
シーダークラスは、アプリケーションに自動的にロードされません。 メインのDatabaseSeeder
クラスを編集して、作成したシーダーへの呼び出しを含める必要があります。
nano
またはお気に入りのエディターを使用して、database/seeds/DatabaseSeeder.php
ファイルを開きます。
nano database/seeds/DatabaseSeeder.php
DatabaseSeeder
クラスは、他のシーダーと同じように見えます。Seeder
クラスから拡張され、run
メソッドがあります。 このメソッドを更新して、PlacesTableSeeder
への呼び出しを含めます。
コメントアウトされた行を削除し、次の強調表示されたコードに置き換えることにより、DatabaseSeeder
クラス内の現在のrun
メソッドを更新します。
database / seeds / DatabaseSeeder.php
… public function run() { $this->call(PlacesTableSeeder::class); } ...
更新後、完全なDatabaseSeeder
クラスは次のようになります。
database / seeds / DatabaseSeeder.php
<?php use Illuminate\Database\Seeder; class DatabaseSeeder extends Seeder { /** * Seed the application's database. * * @return void */ public function run() { $this->call(PlacesTableSeeder::class); } }
コンテンツの更新が完了したら、ファイルを保存して閉じます。
これで、places
テーブルの移行とシーダーの両方のセットアップが完了しました。 次のステップでは、それらを実行する方法を確認します。
ステップ6—データベースの移行とシーダーの実行
先に進む前に、アプリケーションが稼働していることを確認する必要があります。 アプリケーションの暗号化キーを設定し、ブラウザからアプリケーションにアクセスしてWebサーバーをテストします。
Laravelに必要な暗号化キーを生成するには、artisan key:generate
コマンドを使用できます。
docker-compose exec app php artisan key:generate
キーが生成されると、ブラウザでポート8000
のサーバーのホスト名またはIPアドレスを指定することで、アプリケーションにアクセスできるようになります。
http://server_host_or_ip:8000
次のようなページが表示されます。
つまり、アプリケーションはデータベースに接続できますが、places
というテーブルが見つかりませんでした。 次のmigrate
職人コマンドを使用して、places
テーブルを作成します。
docker-compose exec app php artisan migrate
次のような出力が得られます。
OutputMigration table created successfully. Migrating: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_000000_create_users_table (0.06 seconds) Migrating: 2014_10_12_100000_create_password_resets_table Migrated: 2014_10_12_100000_create_password_resets_table (0.06 seconds) Migrating: 2019_08_19_000000_create_failed_jobs_table Migrated: 2019_08_19_000000_create_failed_jobs_table (0.03 seconds) Migrating: 2020_02_10_144134_create_places_table Migrated: 2020_02_10_144134_create_places_table (0.03 seconds)
設定したcreate_places_table
移行とともに、他のいくつかの移行が実行されたことに気付くでしょう。 これらの移行は、Laravelのインストール時に自動生成されます。 現在、これらの追加のテーブルは使用しませんが、将来、アプリケーションを拡張してユーザーを登録し、ジョブをスケジュールするときに必要になります。 今のところ、そのままにしておくことができます。
この時点では、テーブルはまだ空です。 db:seed
コマンドを実行して、サンプルの場所をデータベースにシードする必要があります。
docker-compose exec app php artisan db:seed
これにより、シーダーが実行され、PlacesTableSeeder
クラス内に定義したサンプル値が挿入されます。 次のような出力が表示されます。
OutputSeeding: PlacesTableSeeder Seeded: PlacesTableSeeder (0.06 seconds) Database seeding completed successfully.
次に、ブラウザにアプリケーションページをリロードします。 次のようなページが表示されます。
最初から始める必要があるときはいつでも、次のコマンドですべてのデータベーステーブルを削除できます。
docker-compose exec app php artisan db:wipe
OutputDropped all tables successfully.
アプリの移行を実行し、1つのコマンドでテーブルをシードするには、次を使用できます。
docker-compose exec app php artisan migrate --seed
OutputMigration table created successfully. Migrating: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_000000_create_users_table (0.06 seconds) Migrating: 2014_10_12_100000_create_password_resets_table Migrated: 2014_10_12_100000_create_password_resets_table (0.07 seconds) Migrating: 2019_08_19_000000_create_failed_jobs_table Migrated: 2019_08_19_000000_create_failed_jobs_table (0.03 seconds) Migrating: 2020_02_10_144134_create_places_table Migrated: 2020_02_10_144134_create_places_table (0.03 seconds) Seeding: PlacesTableSeeder Seeded: PlacesTableSeeder (0.06 seconds) Database seeding completed successfully.
移行をロールバックする場合は、次を実行できます。
docker-compose exec app php artisan migrate:rollback
これにより、migrations
フォルダー内の移行クラスごとにdown
メソッドがトリガーされます。 通常、移行クラスで作成されたすべてのテーブルが削除され、手動で作成された可能性のある他のテーブルはすべて削除されます。 次のような出力が表示されます。
OutputRolling back: 2020_02_10_144134_create_places_table Rolled back: 2020_02_10_144134_create_places_table (0.02 seconds) Rolling back: 2019_08_19_000000_create_failed_jobs_table Rolled back: 2019_08_19_000000_create_failed_jobs_table (0.02 seconds) Rolling back: 2014_10_12_100000_create_password_resets_table Rolled back: 2014_10_12_100000_create_password_resets_table (0.02 seconds) Rolling back: 2014_10_12_000000_create_users_table Rolled back: 2014_10_12_000000_create_users_table (0.02 seconds)
ロールバックコマンドは、アプリケーションモデルに変更を加えているときに、db:wipe
コマンドを使用できない場合(たとえば、複数のシステムが同じデータベースに依存している場合)に特に役立ちます。
結論
このガイドでは、データベースの移行とシーダーを使用して、Laravel6アプリケーションの開発とテストデータベースのセットアップを容易にする方法を説明しました。
次のステップとして、クエリビルダーの使用方法、および Eloquentモデルを使用してアプリケーションのデータベーススキーマをさらに抽象化する方法の詳細について、Laravelのドキュメントを確認することをお勧めします。 。