前提条件
- mac Big Sir(intel core)
- LaraDockで環境構築済
※ 今回はマイグレーションの話なので、基本的な操作や概念は変わりませんが、マイグレーションのコマンドがDockerのワークスペースに入って行うので、多少異なっています。
テーブルとマイグレーションファイルを作るコマンド
※ 必ず、Docker Desktopを立ち上げて、laradocディレクトリで
$ docker-compose up -d workspace php-fpm nginx mysql phpmyadmin
のように起動させた状態で行う。
$ docker-compose exec workspace
+コマンド
で、Dockerのワークスペースに入らなくてもコマンドを実行できる。
そのため、マイグレーションコマンドは以下のようになる。
必ずlaradocのディレクトリに移動してから以下のコマンドを実行する。
laradoc$ docker-compose exec workspace php artisan make:model テーブル名 --migration
末尾にオプション--migration
をつけると、テーブルを作ると同時に、マイグレーションファイルを作ってくれるので、そのマイグレーションファイルを開いて、どんなカラムが欲しいか書いていくときに使える。
マイグレーションファイルの所在
マイグレーションファイルはアプリケーションフォルダに存在するので、laradocフォルダの中ではなく、兄弟フォルダのアプリケーションフォルダの中にあるdatabase/migration/の中に作られていく。
テーブルができたら、ここを開いてカラムの指定を書いていこう。
マイグレーションファイルのファイル名の読み方
ファイル名は以下のように、日付と通し番号の後にcreate+テーブル名.php
になってる。
2014_10_12_100000_create_password_resets_table.php
public function up()
の読み方
テーブルを作るときに、なんて名前のテーブルで、どんなカラムを作るのか?という指示をここに書き込む。
サンプル
public function up()
{
Schema::create('password_resets', function (Blueprint $table) {
$table->string('email')->index();
$table->string('token');
$table->timestamp('created_at')->nullable();
});
}
これを元に説明します。
Schemaクラス
MySQLでもPostgreSQLでも、どんなデータベースでも操作できる魔法のクラス集
Schema::create()
テーブルを作るために使えるようにSchemaクラスが持ってるメソッド。
テーブル使いたい時にはこれ使う。
Schema::create('テーブル名', function (Blueprint $table) {ここに欲しいカラムについて書く}
第一引数にテーブル名、第二引数にどんなカラムが欲しいのか渡す関数を設定。
第二引数の関数に渡されてる引数でBlueprintはスキーマビルダとかいう新しいテーブルを定義するためのオブジェクト。$tableはテーブルオブジェクト。両方いつも使う決まり文句なので深く考えないで使いまわそう。
カラムの定義のやり方
基本は以下のような構成で書く
$table->カラムの型('カラムの名前')->カラム修飾子();
$table->bigIncrements('id');
idみたいな勝手に管理番号を割り振っておいてほしい物には$table->bigIncrements()
こんな感じで書く。
$table->timestamps();
テーブルに作成日時と、更新日時を追加したいときは、これ書くと勝手にcreated_atカラムとupdated_atカラム作ってくれる。2個書かなくていい。便利。
$table->timestamp('created_at')->nullable();
と、作成日時が欲しい時は引数に渡してあげるとこんな感じで書く。
->nullable()
はColumn Modifiers(カラム修飾子)とかいうもので、ここにはnullが入ってもいいよ指定。
Column Modifiers
カラムの名前とカラムの型を指定するだけじゃなくて、
public function down()
の読み方
ここに書くと、そのテーブルを消したいときに何をやって欲しいか?を指示できる。
サンプル
public function down()
{
Schema::dropIfExists('password_resets');
}
Schema::dropIfExists
Schema::dropIfExists('テーブル名');
で、消したいテーブル名を引数に入れると、消してくれるメソッド。
消すだけなのでここは記述量が少ない。簡単。
マイグレーションファイルを変更したらマイグレーションの実行
laradoc$ docker-compose exec workspace php artisan migrate
Migration table created successfully.て出たら成功。
データを入れてどんな表示になるか見たい…そうだSeederだ!
テーブルにSQLをぽちぽち打ってデータを挿入しなくても、Seederを使えば連想配列でデータを入れてくれて、ちょっとだけ楽できてチームで共有もできる…そんな便利機能がSeederです。
Seederファイルを作って連想配列を書く
以下のコマンドでテーブルごとに挿入したいデータを記述するSeederファイルを作ります
laradoc$ docker-compose exec workspace php artisan make:seeder ファイル名
Seeder created successfully.と出たら成功。
アプリケーションフォルダ/database/seedsにファイル名.phpというファイルが生成されます。
開くと、以下のような記述がありまます。
public function run()
{
// ここに入れたいデータの連想配列を書いていく
}
連想配列で登録したいデータを書いていきます。
public function run()
{
DB::table('テーブル名')->insert([
[
'カラム名1' => データ1,
'カラム名2' => データ2,
],
[
'カラム名1' => データ3,
'カラム名2' => データ4,
],
]);
}
さっきのファイルが実行されるようにDatabaseSeeder.phpを変更
アプリケーションフォルダ/database/seeds/DatabaseSeeder.phpを開く。
すると以下のような記述があるのでここをカスタマイズする。
public function run()
{
// $this->call(UsersTableSeeder::class);
}
さっき連想配列を書いたファイル名は、その中でファイル名と同じクラスが作られていて、そのクラスの中に連想配列を書いた。
なので、ファイル名=クラス名なので、ここではもともと入っていてコメントアウトされてる
// $this->call(UsersTableSeeder::class);
を利用して、ファイル名を書き込んであげるだけでOK!
public function run()
{
$this->call(ファイル名::class);
}
Seeder実行
laradocディレクトリにいることを確認してから、
laradoc$ docker-compose exec workspace php artisan db:seed
Database seeding completed successfully.と出れば成功!