名言が無い1
Migration の基礎
問題
名言を CRUD 操作するサイトを作ろうとしています。
quotes (名言)に関するテーブルを作り、初期値として、そのデータの個数がゼロであることを確かめてください。
問題は、以下の手順で解いてください。
- Red:小さいテストを作成し、失敗を確認してください
- Green:テストを成功させてください
- Refactor:整理・整頓してください
- 必要に応じて、1から3を繰り返してください
ヒント
背景知識
- CRUD 操作: データを作成、読取、更新、削除する操作のこと
- マイグレート: マイグレーションファイルを実行すること。結果として、データベーステーブルを作成したり、テーブルの構成を変更したりする
- マイグレーションファイル: データベーステーブルの設計図(詳しくは、下の解説をお読みください)
便利なアサーションの例
アサーションの調べ方 も合わせてご覧ください。
今回は、以下を使うのではないかと思います。
-
assertDatabaseEmpty($table_name)(Database テスト : $table_name テーブルが空か)
マイグレーションファイルの作成方法
bash:
php artisan make:migration create_xxx_table
命名規則(ルール)として、 create_xxx_table とする必要があります。
xxx は、英語の複数形にするという規約(ルール)があります。
今回は、 quotes というテーブルを作りたいので、 create_quotes_table になります。
マイグレート状況を確認する方法
以下のコマンドで、その時点のマイグレート状況を確認できます。
bash:
php artisan migrate:status
解答例
続きを読む
実行環境:
- Laravel v13.7.0
- PHP 8.4
- PHPUnit
Red
テストを作成し、失敗を確認します。
bash:
php artisan make:test Database/Migrations/QuotesTest
tests/Feature/Database/Migrations/QuotesTest.php:
<?php
namespace Tests\Feature\Database\Migrations;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class QuotesTest extends TestCase
{
use RefreshDatabase;
public function test_名言テーブルは空(): void
{
$this->assertDatabaseEmpty('quotes');
}
}
bash:
php artisan test ./tests/Feature/Database/Migrations/QuotesTest.php
Green
マイグレーション(テーブル設計)ファイルを作成します。
bash:
php artisan make:migration create_quotes_table
テストを実行して、データベースが空であることを確認します。
bash:
php artisan test ./tests/Database/Migration/QuotesTest.php
Refactor
特にありません。
解説
続きを読む
マイグレーションについて
マイグレーションファイルとは、上でも説明した通り、データベースの設計図です。
up() メソッドにより、柔軟にテーブルを設計できます。
しかし、同じことは CREATE TABLE quotes ... と、生 SQL 文を実行してもできるはずです。
どうしてわざわざ、設計図であるマイグレーションファイルを作成する必要があるのでしょうか?
基本的なアイディアとしては、「確実に、全自動でそのテーブルの設計図を残す」ということです。
現状、動いているシステムのデータベーステーブルが、どのようなカラムで、どのような制約かは、最初にテーブルを作成したり、変更したときの SQL 文が、履歴として完全な形で残っている必要があります。
しかし、履歴管理を手動ですると、ミスが起こるかもしれません。
- その SQL が実行され、反映されたか
- 実行したのに、残っていない SQL 文が無いか
- いつ、どんな順番で実行されたか
- (Git で管理していれば)誰が実行したか
これを解決するには、 PHP ファイルで管理して、 Laravel で確認できるようにするのが良いでしょう。
さらに Laravel では、間違えたときの Rollback (down() メソッド)など、テーブルの操作は一通りできるようになっています。
Laravel においては、「データベースを生 SQL で触らない」というのは、鉄則になっているようです。
マイグレートについて
上記の例では、テストを実行するので、マイグレートのコマンドは出てきませんでした。
作成したマイグレートの実行の様子を見てみましょう。
マイグレーションファイルを作った後、次のコマンドを、1行ずつ実行してみてください。
bash:
php artisan migrate:status
php artisan migrate:fresh
php artisan migrate:status
- 1行目の status 表示で、マイグレートされていないマイグレーションファイルが分かります
- 2行目で、実際にマイグレートを実行します。
freshを付けると、すべてのデータが一旦削除され、マイグレートが順番に実行されます - 3行目の status 表示で、1行目から変わっていることを確認してください
また、実務における運用として、常に以下のコマンドで再作成できるようにしておくと、データベース周りの運用が楽になるようです。
詳しい説明は、 こちらのブログ記事 が参考になります。
bash:
php artisan migrate:fresh --seed
RefreshDatabase について
今回のテストでは、 class の中に use RefreshDatabase; が使われています。
この use 文によって、テスト内で php artisan migrate:fresh 同等の実行がなされます。
モデルと一緒に作る
多くの場合、マイグレーションファイルは、 Eloquent モデルと一緒に作成すると思うので、そちらのコマンドも紹介しておきます。
これは、 Model の問題で利用します。
bash:
php artisan make:model Quote --migration
このコマンドで、\App\Models\Quote クラス(Eloquent モデル)と、 create_quotes_table マイグレーションファイルが、同時に作成できます。
Quote とコマンドに書くだけで、それを小文字にし、複数形にしたマイグレーションファイルを作成してくれます。
(たとえば、 Person => create_people_table のように、単純に末尾に s を付けるだけではない変換をしてくれます)