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セットアップが含まれています。 この例では、アプリケーションをホームフォルダーにダウンロードしますが、任意のディレクトリを使用できます。

  1. cd ~
  2. curl -L https://github.com/do-community/travellist-laravel-demo/archive/tutorial-2.0.1.zip -o travellist.zip

アプリケーションコードを .zip ファイル、必要になります unzip 解凍するコマンド。 最近行っていない場合は、マシンのローカルパッケージインデックスを更新します。

  1. sudo apt update

次に、をインストールします unzip パッケージ:

  1. sudo apt install unzip

その後、アプリケーションのコンテンツを解凍します。

  1. unzip travellist.zip

次に、簡単にアクセスできるように、解凍したディレクトリの名前をtravellist-demoに変更します。

  1. mv travellist-laravel-demo-tutorial-2.0.1 travellist-demo

次のステップでは、 .env アプリケーションをセットアップするための構成ファイル。

ステップ2—アプリケーションの設定 .env ファイル

Laravelでは、 .env ファイルは、環境に依存する構成をセットアップするために使用されます。たとえば、クレデンシャルやデプロイメント間で異なる可能性のある情報などです。 このファイルはリビジョン管理に含まれていません。

警告:環境構成ファイルには、データベースの資格情報やセキュリティキーなど、サーバーに関する機密情報が含まれています。 そのため、このファイルを公に共有しないでください。

に含まれる値 .env ファイルは、にある通常の構成ファイルで設定された値よりも優先されます。 config ディレクトリ。 新しい環境にインストールするたびに、データベース接続設定、デバッグオプション、アプリケーションURLなど、アプリケーションを実行している環境によって異なる項目を定義するために、調整された環境ファイルが必要です。

に移動します travellist-demo ディレクトリ:

  1. cd travellist-demo

新しいを作成します .env セットアップする開発環境の構成オプションをカスタマイズするためのファイル。 Laravelには例があります.env コピーして独自のファイルを作成できるファイル:

  1. cp .env.example .env

を使用してこのファイルを開く nano または選択したテキストエディタ:

  1. 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

現在 .env からのファイル travellist デモアプリケーションには、このシリーズの最後のパートでDockerComposeを使用して作成したコンテナー化された環境を使用するための設定が含まれています。 これらの値を変更する必要はありませんが、自由に変更できます。 DB_DATABASE, DB_USERNAMEDB_PASSWORD あなたが望むなら、これらは私たちによって引っ張られているので docker-compose.yml 開発データベースを設定するために自動的にファイルします。 確認してください DB_HOST Docker Compose環境内のデータベースサービスの名前を参照するため、変数は変更されません。

ファイルに変更を加えた場合は、必ずを押して保存して閉じてください。 CTRL + X, Y、 それから ENTER.

LEMP サーバーでアプリケーションを実行することを選択した場合は、強調表示された値を変更して、独自のデータベース設定を反映する必要があります。 DB_HOST 変数。

ステップ3—Composerを使用したアプリケーションの依存関係のインストール

次に、PHPの依存関係管理ツールである Composer を使用して、アプリケーションの依存関係をインストールし、実行できることを確認します。 artisan コマンド。

次のコマンドを使用して、DockerCompose環境を起動します。 これにより、 travellist の画像 app サービスを提供し、必要な追加のDockerイメージをプルします nginxdb アプリケーション環境を作成するためのサービス:

  1. docker-compose up -d
Output
Creating 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 このガイド全体にリストされているコマンドの一部。 たとえば、次のコマンドを記述どおりに実行する代わりに、次のコマンドを実行するだけです。

  1. composer install

実行するには composer install の中に app コンテナ、実行:

  1. docker-compose exec app composer install
Output
Loading 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 コマンド。 アプリケーションがデータベースに接続できることをテストするには、次のコマンドを実行して、既存のテーブルをクリーンアップします。

  1. docker-compose exec app php artisan db:wipe

このコマンドは、構成されたデータベース上の既存のテーブルをすべて削除します。 正常に実行され、アプリケーションがデータベースに接続できる場合は、次のような出力が表示されます。

Output
Dropped all tables successfully.

Composerを使用してアプリケーションの依存関係をインストールしたので、次を使用できます。 artisan 移行とシーダーを作成するためのツール。

ステップ4—データベース移行の作成

The artisan Laravelに同梱されているコマンドラインツールには、アプリケーションの管理と新しいクラスのブートストラップに使用できる一連のヘルパーコマンドが含まれています。 新しい移行クラスを生成するには、 make:migration 次のようにコマンド:

  1. docker-compose exec app php artisan make:migration create_places_table

Laravelは実行される操作を推測します(create)、テーブルの名前(places)、およびこの移行で新しいテーブルが作成されるかどうかは、 make:migration 指図。

次のような出力が表示されます。

Output
Created Migration: 2020_02_03_143622_create_places_table

これにより、アプリケーションの新しいファイルが生成されます database/migrations ディレクトリ。 自動生成されたファイルに含まれるタイムスタンプは、移行を実行する順序を決定するためにLaravelによって使用されます。

選択したテキストエディタを使用して、生成された移行ファイルを開きます。 強調表示された値を独自の移行ファイル名に置き換えることを忘れないでください。

  1. 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');
    }
}

このクラスには2つのメソッドがあります。 updown. どちらの方法にもブートストラップコードが含まれており、移行を実行したときに何が起こるか、またロールバックしたときに何が起こるかをカスタマイズするために拡張できます。

変更します up 方法 places 表は、現在のアプリケーションのバージョンですでに使用している構造を反映しています。

  • id:主キーフィールド。
  • name:場所の名前。
  • visited:この場所がすでに訪れたかどうか。

Laravelスキーマビルダーは、データベース内のテーブルを作成、更新、削除するためのメソッドを公開しています。 The Blueprint クラスはテーブルの構造を定義し、各テーブルフィールドの定義を抽象化するためのいくつかのメソッドを提供します。

自動生成されたコードは、と呼ばれるプライマリIDフィールドを設定します id. The timestamps メソッドは2つ作成します datetime データがそのテーブル内に挿入または更新されたときに、基になるデータベースクラスによって自動的に更新されるフィールド。 これらに加えて、 namevisited 分野。

私たちの name フィールドはタイプになります string、および visited フィールドはで設定されます boolean タイプ。 また、デフォルト値を設定します 0 のために visited フィールド。値が渡されない場合は、その場所がまだ訪問されていないことを意味します。 これがどのように 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 私たちの新しいシーダークラスを生成するコマンド places と呼ばれるテーブル PlacesTableSeeder:

  1. docker-compose exec app php artisan make:seeder PlacesTableSeeder

このコマンドは、という新しいファイルを作成します PlacesTableSeeder.phpdatabase/seeds ディレクトリ。 選択したテキストエディタを使用してそのファイルを開きます。

  1. 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 アーティザンコマンドが実行されます。

編集する必要があります 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'
    ];

次に、 use 私たちの上部にある声明 PlacesTableSeeder 参照を容易にするクラス DB コード全体のファサード:

database / seeds / PlacesTableSeeder.php
<?php

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;

class PlacesTableSeeder extends Seeder
…

これで、 $places を使用した配列値 foreach ループして、それぞれを挿入します places クエリビルダーを使用したテーブル:

database / seeds / PlacesTableSeeder.php
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 すべての更新後、クラスは次のようになります。

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 作成したシーダーへの呼び出しを含めるクラス。

を開きます database/seeds/DatabaseSeeder.php を使用してファイル nano またはお気に入りの編集者:

  1. nano database/seeds/DatabaseSeeder.php

The DatabaseSeeder クラスは他のシーダーと同じように見えます。 Seeder クラスがあり、 run 方法。 このメソッドを更新して、への呼び出しを含めます PlacesTableSeeder.

現在の更新 run あなたの中のメソッド DatabaseSeeder コメントアウトされた行を削除し、次の強調表示されたコードに置き換えることにより、クラスを作成します。

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 指図:

  1. docker-compose exec app php artisan key:generate

キーが生成されると、ブラウザでサーバーのホスト名またはポートのIPアドレスを指定することでアプリケーションにアクセスできるようになります 8000:

http://server_host_or_ip:8000

次のようなページが表示されます。

つまり、アプリケーションはデータベースに接続できますが、というテーブルが見つかりませんでした places. 作成します places 次を使用して、今テーブル migrate 職人のコマンド:

  1. docker-compose exec app php artisan migrate

次のような出力が得られます。

Output
Migration 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 サンプルの場所をデータベースにシードするコマンド:

  1. docker-compose exec app php artisan db:seed

これにより、シーダーが実行され、定義したサンプル値が挿入されます。 PlacesTableSeeder クラス。 次のような出力が表示されます。

Output
Seeding: PlacesTableSeeder Seeded: PlacesTableSeeder (0.06 seconds) Database seeding completed successfully.

次に、ブラウザにアプリケーションページをリロードします。 次のようなページが表示されます。

最初から始める必要があるときはいつでも、次のコマンドですべてのデータベーステーブルを削除できます。

  1. docker-compose exec app php artisan db:wipe
Output
Dropped all tables successfully.

アプリの移行を実行し、1つのコマンドでテーブルをシードするには、次を使用できます。

  1. docker-compose exec app php artisan migrate --seed
Output
Migration 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.

移行をロールバックする場合は、次を実行できます。

  1. docker-compose exec app php artisan migrate:rollback

これにより、 down 内部の各移行クラスのメソッド migrations フォルダ。 通常、移行クラスで作成されたすべてのテーブルが削除され、手動で作成された可能性のある他のテーブルはすべて削除されます。 次のような出力が表示されます。

Output
Rolling 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のドキュメントを確認することをお勧めします。 。