名言集には名言がある
Migration の基礎
問題
名言を CRUD 操作するサイトを作ろうとしています。
Quote (名言)に関する Eloquent モデルと、それに対応するテーブルを作ってください。
次に、そのテーブルのスキーマに quote カラムがあることを確かめてください。
問題は、以下の手順で解いてください。
- Red:小さいテストを作成し、失敗を確認してください
- Green:テストを成功させてください
- Refactor:整理・整頓してください
- 必要に応じて、1から3を繰り返してください
ヒント
用語の意味
- データベーステーブルのスキーマ: データベーステーブルのカラム名や、制約などをまとめたもの
Laravel では、 Illuminate\Support\Facades\Schema::hasColumn($table_name, $column_name) で、$table_name テーブルに $column_name が存在するかどうかの真偽値を返します。
便利なアサーションの例
アサーションの調べ方 も合わせてご覧ください。
今回は、以下を使うのではないかと思います。
-
assertTrue($condition)(PHPUnit : $condition が true か)
解答例
続きを読む
実行環境:
- Laravel v13.7.0
- PHP 8.4
- PHPUnit
Red
テストを作成し、失敗を確認します。
bash:
php artisan make:test App/Models/QuoteTest
<?php
namespace Tests\Feature\App\Models;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
use Illuminate\Support\Facades\Schema;
class QuoteTest extends TestCase
{
use RefreshDatabase;
public function test_quotes_table_has_quote_column(): void
{
$this->assertTrue(Schema::hasColumn('quotes', 'quote'));
}
}
php artisan test ./tests/Feature/App/Models/QuoteTest.php
Green
Quote モデル及びそのテーブルを作成します。
bash:
php artisan make:model Quote -m
マイグレーションファイルを編集します。
database/migrations/日付_数字_create_quotes_table.php:
public function up(): void
{
Schema::create('quotes', function (Blueprint $table) {
$table->id();
$table->text('quote');
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('quotes');
}
テストを実行し、成功を確認します。
Refactor
今回は、特にありません。
解説
続きを読む
マイグレーションファイルの書き方
マイグレーションファイルには、 up() メソッドと down() メソッドがあります。
use RefreshDatabase; のあるテストの実行時や、 php artisan migrate:fresh --seed を行うときに実行されるのが up() メソッドです。
一方、 php artisan migrate:rollback 時に実行されるのが down() メソッドです。
つまり、 down() メソッドは、 up() メソッドを無かったことにする操作を書きます。
今回の問題では、up() メソッドはテーブルを作成しますので、 down() メソッドでは、そのテーブルを削除するコマンドが書かれていると思います。(デフォルトのままです)
ただし、データベースには、単純な逆操作ができない操作もありますから、実装時は注意が必要です。