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:seedArtisanコマンドが実行されたときに呼び出されます。
データベースにサンプルデータを挿入するための命令を含めるには、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のドキュメントを確認することをお勧めします。 。