Laravelに搭載されている、DBのテーブルを操作するマイグレーションとシーディングについてメモ。
概要
マイグレーション
- マイグレーションとは、データベースのバージョン管理機能である
- CREATE TABLEの代わりに使用する
- 以下が指定できる
- テーブル名
- カラム名
- データ型
- phpの関数で実行する。
- 以下が指定できる
シーディング
- シーディングとは、テーブルに対してデータを登録する際に利用する
シーディングを利用するメリットとしては以下が挙げられる。
- 開発環境を作成するときに正確なテストデータが簡単に再現できる
- DUMPファイル不要
- 大量にデータが入ったDBだったら必要だけども
- DUMPファイル不要
- チームメンバーに環境を渡すときにソースファイルだけ渡せば再現できる
マイグレーションのやり方
作業の流れ
以下の3ステップで行う。
- マイグレーション用のファイルを作成する
- 上記のファイル内にマイグレーションのスクリプトを記述する
- 上記のファイルをartisan migrateコマンドで実行すると、Tableが作成される
具体的手順
1. マイグレーション用のファイルを作成する
マイグレーション用のファイルを用意する。
以下のコマンドで雛形ファイルが生成できる。
php artisan make:migration ファイル名
例)
$ php artisan make:migration create_stores_table
Created Migration: 2023_02_02_071927_create_stores_table
ファイル名は、任意っぽいが、
「create_テーブル名_table」
とするとわかりやすいので良いみたい。
例)hoges テーブル作成用のファイルを作成する
php artisan make:migration create_hoges_table
Laravelでのテーブル名は複数形で作ること。単数形にしても対処はできるが、複数形で作ることを想定されてるので。チームでやるプロジェクトならなおさら。
2. 上記のファイル内にマイグレーションのスクリプトを記述する
マイグレーション用のファイルを作成したら、
中身を編集してスクリプトを作る。
make:migration コマンドを実行すると以下の内容のファイルができる。
2つの関数が用意されている。
- function up()
- function down()
function up()
テーブル作成時に使う関数。
デフォルトで以下の記述があると思う。
$table->id();
$table->timestamp();
上記に書きたしてく。
‘name’ という名前のテーブルを文字列型のデータ型で作成したい場合は、
$table->string('name');
と書く。見てわかるが、「string」の部分がデータ型。
よく使いそうな データ型は、Qiitaにまとめてくださっている人がいるのでそちら参考。
- increments(‘id’) … 「符号なしINT」を使用した自動増分ID(主キー)
- binary(‘カラム名’) … バイナリデータカラム
- boolean(‘カラム名’) … 真偽値カラム
- char(‘カラム名’, 長さ) … 長さを指定する文字列カラム
- date(‘カラム名’) … 日付カラム
- time(‘カラム名’) … 時間カラム
- dateTime(カラム名) … 日時カラム
- double(‘カラム名’, 桁数, 小数点以下桁数) … ○ 桁で小数点以下× 桁の小数カラム
- enum(‘カラム名’, [‘定数’, ‘定数’]) … ENUMカラム
- integer(‘カラム名’) … 数値データカラム
- json(‘カラム名’) … JSONフィールドカラム
- timestamp(‘カラム名’) … TIMESTAMPカラム
- timestamps() … created_atとupdate_atカラム
- nullableTimestamps() … NULL値を許す以外、timestamps()と同じ
- string(‘カラム名’) … VARCHARカラム
- string(‘カラム名’, 長さ) … 長さ指定のVARCHARカラム
- text(‘カラム名’) … TEXTカラム
すべてのデータ型を見るには、
Laravel日本語マニュアル%3B%0A%7D)%3B-,%E5%88%A9%E7%94%A8%E5%8F%AF%E8%83%BD%E3%81%AA%E3%82%AB%E3%83%A9%E3%83%A0%E3%82%BF%E3%82%A4%E3%83%97,-%E3%82%B9%E3%82%AD%E3%83%BC%E3%83%9E%E3%83%93%E3%83%AB%E3%83%80%E3%81%AEBlueprint)を参照する。
MySQLで、数値のデータ型の桁数を知りたい場合 → 公式のリファレンス
ちなみにenum型はあんま使わんほうがいいかも。Qiita
function down()
テーブル削除時に使う関数。
3. 上記のファイルをartisan migrateコマンドで実行すると、Tableが作成される
以下のコマンドでマイグレーションが実行される。
php aritsan migrate
「Could not open input file: artisan」って怒られる場合
php aritsan migrate
コマンドを実行した際、
「Could not open input file: artisan」って怒られたときは、
実行場所が間違っている可能性が高い。
Laravelディレクトリのトップディレクトリに移動してから実行すること。
「 SQLSTATE[HY000] [1045] Access denied for user ‘root’@’localhost’ (using password: NO) (SQL: select * from information_schema.tables where table_schema = laravel and table_name = migrations and table_type = ‘BASE TABLE’)」って怒られる場合
SQLSTATE[HY000] [1045] Access denied for user ‘root’@’localhost’ (using password: NO) (SQL: select * from information_schema.tables where table_schema = laravel and table_name = migrations and table_type = ‘BASE TABLE’)
のようなメッセージが出たときは、MySQLへアクセスする情報が間違っている。
以下いずれかを確認する。
- .env
- config/database.php
拙僧は.envがデフォのままだった。てへぺろ。
- artisanコマンドとは、Laravelに用意された、Laravelのなんやかんやを行う際に使用するコマンド
down()メソッドを使ってもとに戻したい場合
down()メソッドを実行するには以下のコマンド。
php artisan migrate:rollback
ただし、このコマンドで、downメソッドが実行されるのは、直近のマイグレーションだけ。
何回も実行すれば、さかのぼって過去のマイグレーションに対するdown()メソッドが実行されていく。
全部まとめてdownメソッド実行したい場合は以下のコマンド。
php artisan migrate:reset
上記コマンドを行うことにより、すべてのマイグレーションがリセットされる
= すべてのtable が削除される。
- 事前のバックアップ取得をお忘れなく
- データももちろん全部なくなりますので
作成済みのテーブルにフィールド(カラム)を追加したい場合
すでに作成済みのテーブルに新たにフィールドを追加したい場合は、新たにフィールド追加用のmigrationファイルを作成するのがよい。
マイグレーションファイル作成コマンド
構文:
php artisan make:migration ファイル名 --table=対象のテーブル名
例:
pointsテーブルに、「user_id」フィールドを追加する。
php artisan make:migration add_user_id_to_points_table --table=points
ファイルの中身編集
up()関数のところに、フィールド追加を、
down()関数のところに、フィールド削除(元に戻すためのもの)を追加する。
public function up()
{
Schema::table('points', function (Blueprint $table) {
+ $table->integer('user_id'); //フィード追加
});
}
@@ -26,7 +26,7 @@ class AddUserIdToPointsTable extends Migration
public function down()
{
Schema::table('points', function (Blueprint $table) {
+ $table->dropColumn('user_id'); //フィールド削除
});
}
マイグレーション実行
確認
php artisan migrate:status
実行
php artisan migrate
確認
php artisan migrate:status
マイグレーションの参考文献
シーディングのやり方
作業の流れ
作業の流れは以下の通り。
- シーダーファイルを作成する
- 作成されたシーダーファイルを編集する
- シーダーファイルを登録する
- シーダーファイルを実行する
具体的手順
1. シーダーファイルを作成する
以下のコマンドでシーダーファイルが作成できる
php artisan make:seeder ファイル名
例)
php artisan make:seeder StoresTableSeeder
すると、
database/seeds/StoresTableSeeder.php
が作成される。
2. 作成されたシーダーファイルを編集する
database/seeds/StoresTableSeeder.php
を開くと、以下の中身になっている。
1 <?php
2
3 use Illuminate\Database\Seeder;
4
5 class StoresTableSeeder extends Seeder
6 {
7 /**
8 * Run the database seeds.
9 *
10 * @return void
11 */
12 public function run()
13 {
14 //
15 }
16 }
14行目と15行目の間に追加していく。
1 <?php
2
3 use Illuminate\Database\Seeder;
4
5 class StoresTableSeeder extends Seeder
6 {
7 /**
8 * Run the database seeds.
9 *
10 * @return void
11 */
12 public function run()
13 {
14 //
15 $param = [
16 'カラム名' => 'データ',
17 'カラム名' => 'データ',
18 'カラム名' => 'データ',
19 'カラム名' => 'データ',
20 'カラム名' => 'データ',
21 'カラム名' => 'データ',
22 ];
23 DB::table('テーブル名')->insert($param);
24 }
25 }
ていう感じ。
複数書いても良い。例えば、
以下の感じ。
1 <?php
2
3 use Illuminate\Database\Seeder;
4
5 class StoresTableSeeder extends Seeder
6 {
7 /**
8 * Run the database seeds.
9 *
10 * @return void
11 */
12 public function run()
13 {
14 //
15 $param = [
16 'name' => 'セブンイレブン',
17 'tel' => '03-1234-1234',
18 'area' => '新宿',
19 'url' => 'https://seven',
20 ];
21 DB::table('stores')->insert($param);
22
23 $param = [
24 'name' => 'ファミマ',
25 'tel' => '03-1234-1234',
26 'area' => '渋谷',
27 'url' => 'https://famima',
28 ];
29 DB::table('stores')->insert($param);
30 }
31 }
3. シーダーファイルを登録する
database/seeds/DatabaseSeeder.php
ファイルをテキストエディタで開く。
$this->call(シーダークラス::class);
のように追記する。
1 <?php
2
3 use Illuminate\Database\Seeder;
4
5 class DatabaseSeeder extends Seeder
6 {
7 /**
8 * Seed the application's database.
9 *
10 * @return void
11 */
12 public function run()
13 {
14 // $this->call(UserSeeder::class);
15 $this->call(StoresTableSeeder::class);
16 }
17 }
~
15行目を追記した。
4. シーダーファイルを実行する
以下のコマンドでシーディングを実行する。
php artisan db:seed
これで、シーンディングが実行され、テーブルにレコードが登録される。
シーディング取り消し
シーダーファイルを作成しただけの状態の場合
Laravelのコマンドでファイル作成自体を取り消すコマンドは用意されていないので、
database/seeders/ フォルダ配下に出来上がったファイルを削除するだけで良い。
コメント