Laravelでデータベースセットアップを抽象化するためにデータベース移行とシーダーを使用する方法
Migrationsおよびseedersは、 Laravel PHPフレームワークによって提供される強力なデータベースユーティリティであり、開発者はアプリケーションのデータベースをすばやくブートストラップ、破棄、および再作成できます。 これらのユーティリティは、同じアプリケーションで作業している複数の開発者で発生する可能性のあるデータベースの不整合の問題を最小限に抑えるのに役立ちます。新しい寄稿者は、2、3を実行するだけで済みます。 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には例があります.env
コピーして独自のファイルを作成できるファイル:
- cp .env.example .env
を使用してこのファイルを開く nano
または選択したテキストエディタ:
- nano .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
…
現在 .env
からのファイル travellist
デモアプリケーションには、このシリーズの最後のパートでDockerComposeを使用して作成したコンテナー化された環境を使用するための設定が含まれています。 これらの値を変更する必要はありませんが、自由に変更できます。 DB_DATABASE
, DB_USERNAME
と DB_PASSWORD
あなたが望むなら、これらは私たちによって引っ張られているので docker-compose.yml
開発データベースを設定するために自動的にファイルします。 確認してください DB_HOST
Docker Compose環境内のデータベースサービスの名前を参照するため、変数は変更されません。
ファイルに変更を加えた場合は、必ずを押して保存して閉じてください。 CTRL + X
, Y
、 それから ENTER
.
注: LEMP サーバーでアプリケーションを実行することを選択した場合は、強調表示された値を変更して、独自のデータベース設定を反映する必要があります。 DB_HOST
変数。
ステップ3—Composerを使用したアプリケーションの依存関係のインストール
次に、PHPの依存関係管理ツールである Composer を使用して、アプリケーションの依存関係をインストールし、実行できることを確認します。 artisan
コマンド。
次のコマンドを使用して、DockerCompose環境を起動します。 これにより、 travellist
の画像 app
サービスを提供し、必要な追加のDockerイメージをプルします nginx
と db
アプリケーション環境を作成するためのサービス:
- 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を実行してアプリケーションの依存関係をインストールできます。
実行するには composer
およびその他のコマンド app
サービスコンテナ、使用します docker-compose exec
. The exec
commandを使用すると、DockerComposeによって管理されているコンテナーで任意のコマンドを実行できます。 次の構文を使用します。 docker-compose exec service_name command
.
注:LEMPサーバーを使用してデモアプリケーションを実行することを選択した場合は、無視する必要があります。 docker-compose exec app
このガイド全体にリストされているコマンドの一部。 たとえば、次のコマンドを記述どおりに実行する代わりに、次のコマンドを実行するだけです。
- composer install
実行するには composer install
の中に app
コンテナ、実行:
- 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—データベース移行の作成
The artisan
Laravelに同梱されているコマンドラインツールには、アプリケーションの管理と新しいクラスのブートストラップに使用できる一連のヘルパーコマンドが含まれています。 新しい移行クラスを生成するには、 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
:
<?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');
}
}
このクラスには2つのメソッドがあります。 up
と down
. どちらの方法にもブートストラップコードが含まれており、移行を実行したときに何が起こるか、またロールバックしたときに何が起こるかをカスタマイズするために拡張できます。
変更します up
方法 places
表は、現在のアプリケーションのバージョンですでに使用している構造を反映しています。
id
:主キーフィールド。name
:場所の名前。visited
:この場所がすでに訪れたかどうか。
Laravelスキーマビルダーは、データベース内のテーブルを作成、更新、削除するためのメソッドを公開しています。 The Blueprint
クラスはテーブルの構造を定義し、各テーブルフィールドの定義を抽象化するためのいくつかのメソッドを提供します。
自動生成されたコードは、と呼ばれるプライマリIDフィールドを設定します id
. The timestamps
メソッドは2つ作成します datetime
データがそのテーブル内に挿入または更新されたときに、基になるデータベースクラスによって自動的に更新されるフィールド。 これらに加えて、 name
と visited
分野。
私たちの name
フィールドはタイプになります string
、および visited
フィールドはで設定されます boolean
タイプ。 また、デフォルト値を設定します 0
のために visited
フィールド。値が渡されない場合は、その場所がまだ訪問されていないことを意味します。 これがどのように up
メソッドは次のようになります。
…
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
私たちの新しいシーダークラスを生成するコマンド places
と呼ばれるテーブル PlacesTableSeeder
:
- docker-compose exec app php artisan make:seeder PlacesTableSeeder
このコマンドは、という新しいファイルを作成します PlacesTableSeeder.php
中 database/seeds
ディレクトリ。 選択したテキストエディタを使用してそのファイルを開きます。
- nano database/seeds/PlacesTableSeeder.php
これは自動生成されたものです PlacesTableSeeder.php
ファイルは次のようになります:
<?php
use Illuminate\Database\Seeder;
class PlacesTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
//
}
}
新しいシーダークラスには、という名前の空のメソッドが含まれています run
. このメソッドは、 db:seed
アーティザンコマンドが実行されます。
編集する必要があります run
データベースにサンプルデータを挿入するための命令を含めるためのメソッド。 Laravelクエリビルダーを使用してこのプロセスを合理化します。
Laravelクエリビルダーは、データの挿入、更新、削除、取得などのデータベース操作のための流暢なインターフェースを提供します。 また、SQLインジェクション攻撃に対する保護手段も紹介します。 クエリビルダーは、 DB
facade-サービスコンテナ内の基盤となるデータベースクラスへの静的プロキシ。
まず、静的クラス変数を作成して、データベースに配列として挿入するすべてのサンプルの場所を保持します。 これにより、 foreach
ループしてすべての値を反復処理し、クエリビルダーを使用して各値をデータベースに挿入します。
この変数を呼び出します $places
:
<?php
use Illuminate\Database\Seeder;
class PlacesTableSeeder extends Seeder
{
static $places = [
'Berlin',
'Budapest',
'Cincinnati',
'Denver',
'Helsinki',
'Lisbon',
'Moscow',
'Nairobi',
'Oslo',
'Rio',
'Tokyo'
];
…
次に、 use
私たちの上部にある声明 PlacesTableSeeder
参照を容易にするクラス DB
コード全体のファサード:
<?php
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
class PlacesTableSeeder extends Seeder
…
これで、 $places
を使用した配列値 foreach
ループして、それぞれを挿入します places
クエリビルダーを使用したテーブル:
…
public function run()
{
foreach (self::$places as $place) {
DB::table('places')->insert([
'name' => $place,
'visited' => rand(0,1) == 1
]);
}
}
The foreach
ループは、の各値を繰り返し処理します $places
静的配列。 各反復で、 DB
に新しい行を挿入するファサード places
テーブル。 設定します name
から取得した場所の名前へのフィールド $places
配列、およびを設定します visited
フィールドをいずれかのランダムな値に 0
また 1
.
これは完全なものです PlacesTableSeeder
すべての更新後、クラスは次のようになります。
<?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
作成したシーダーへの呼び出しを含めるクラス。
を開きます database/seeds/DatabaseSeeder.php
を使用してファイル nano
またはお気に入りの編集者:
- nano database/seeds/DatabaseSeeder.php
The DatabaseSeeder
クラスは他のシーダーと同じように見えます。 Seeder
クラスがあり、 run
方法。 このメソッドを更新して、への呼び出しを含めます PlacesTableSeeder
.
現在の更新 run
あなたの中のメソッド DatabaseSeeder
コメントアウトされた行を削除し、次の強調表示されたコードに置き換えることにより、クラスを作成します。
…
public function run()
{
$this->call(PlacesTableSeeder::class);
}
...
これは完全な方法です DatabaseSeeder
更新後のクラスは次のようになります。
<?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
キーが生成されると、ブラウザでサーバーのホスト名またはポートのIPアドレスを指定することでアプリケーションにアクセスできるようになります 8000
:
http://server_host_or_ip:8000
次のようなページが表示されます。
つまり、アプリケーションはデータベースに接続できますが、というテーブルが見つかりませんでした places
. 作成します places
次を使用して、今テーブル migrate
職人のコマンド:
- 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
これにより、 down
内部の各移行クラスのメソッド migrations
フォルダ。 通常、移行クラスで作成されたすべてのテーブルが削除され、手動で作成された可能性のある他のテーブルはすべて削除されます。 次のような出力が表示されます。
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のドキュメントを確認することをお勧めします。 。