laravel5.5 を使ってマイグレーションでデータベースのテーブルを作成し、シーディングで作成したテーブルを初期化します。使用した各ソフトのバーションを次に示します。
- Windows 7 Professional SP1 32-bit
- Xampp Version: 7.2.4
PHP 7.2.4 - Laravel 5.5.10
- Composer 1.6.3
laravel5.5のインストール
「Laravel 5.6のインストール」に従ってlaravel5.5のインストールをインストールします。ただし、Composerを使用したLaravel 5.5のインストールでは、次のコマンドを実行し、プロジェクトを「laravel55」とします。
> composer create-project laravel/laravel --prefer-dist laravel 5.5
データベース名は「laravel」とし、マイグレーションの方法を確認するため、マイグレーションによるデータベーステーブルの作成を行わず、フォルダ「laravel55/database/migrations」内のファイルは削除しておきます。
ブラウザ上からURL「http://localhost/laravel55/public/」を入力してLaravelを起動すると、次の画面が表示されます。
マイグレーションによるデータベーステーブルの作成
マイグレーションは、データベースのテーブル作成や編集などを管理する方法で、複数のデータベースに同じ記述で対応でき、ロールバックもコマンド1つで可能となります。
マイグレーションの作成
次のコマンドを実行すると、タイムスタンプのついた「create_applicant_info_table」が作成され、テーブル名が「applicant_info」となります。ファイル名は「create_xxxx_table」とし、xxxxをテーブル名とします。
>php artisan make:migration create_applicant_info_table --create=applicant_info Created Migration: 2019_04_29_212647_create_applicant_info_table
テーブル構造の作成
「database/migrations」に作成された「2019_04_29_212647_create_applicant_info_table.php」のupメソッドに次のデータ項目を追加します
$table->string('Name',70); $table->string('Address',120); $table->string('Telephone',20); $table->string('FAX',20); $table->string('E-MAIL',70);
マイグレーションの実行(テーブルの作成)
作成したマイグレーションを次のコマンドで実行します。
> php artisan migrate
なお、migrationsテーブルにより管理されているため、何回やっても「Nothing to migrate.」となり、データベーステーブルは更新されません。データベース「laravel」に作成されたmigrationsテーブルの内容を次に示します。
シーディングによるデータベーステーブルの初期化
Laravelには、「シーダクラス(初期値設定クラス)」があり、データベースへ初期データを簡単に投入できます。例えば、マイグレーションでデータベースを構築し、シーディングで初期データを投入するようにしておけば、いつでもデータベースの再構築と初期データの投入までを行えます。
シーダの作成
初期化するデータを記述するSeedファイルを次のコマンドで生成します。シーダクラス名は「xxxxSeeder」とし、xxxxをテーブル名とします。ここでは「applicant_infoSeeder」としました。
> php arnotisan make:seeder applicant_infoSeeder
シーダークラスの定義
作成した「database/seeds/applicant_infoSeeder.php」のrun()メソッドに、初期化するデータを定義するため、次のように編集します。
DB::table('applicant_info')->insert([ [ 'Name' => 'ブック1', 'Address' => '著者', 'Telephone' => 'Telephone', 'FAX' => 'FAX', 'E-MAIL' => 'E-MAIL', ], [ 'Name' => 'ブック2', 'Address' => '著者', 'Telephone' => 'Telephone', 'FAX' => 'FAX', 'E-MAIL' => 'E-MAIL', ], [ 'Name' => 'ブック3', 'Address' => '著者', 'Telephone' => 'Telephone', 'FAX' => 'FAX', 'E-MAIL' => 'E-MAIL', ], ]);
シーダクラスをコールする設定
次にこのシーダクラスをシーディング実行時にコールするため、フォルダ「seeds」にあるもう一つのファイル「DatabaseSeeder.php」に次の記述を追加します。
$this->call(applicant_infoSeeder::class);
シーダの実行
次のコマンドでシーディングを実行します。
> php artisan db:seed Seeding: applicant_infoSeeder
データベース「laravel」に作成された初期化されたapplicant_infoテーブルの内容を次に示します。
usersテーブルのマイグレーションを実行すると Syntax error
今回の環境では、次のSyntax error が発生しました。
「 SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes」
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQL: alter table `users` add unique `users_email_unique`(`email`))
調べてみると、
- Laravel5.4以上
- MySQL5.7.7未満
で発生するようで、原因は
- Laravel5.4から標準charasetがutf8mb4に変わった
- MySQL5.7.7未満ではユニーク制約を付けたカラムは最大767bytes
で、解決方法として、charasetをutf8mb4にして、MySQLのバージョンを最新にする必要があります。