#04 Laravelを始めよう

データベースとマイグレーション

これまでの記事でページを表示するしくみを学びました。実際のアプリはデータを保存・取得する必要があります。今回は データベース? データを整理して保存・検索できるソフトウェア。Webアプリのユーザー情報や投稿データなどはここに保存される。 の準備をしましょう。


データベース接続の設定

Laravelのデータベース設定はプロジェクトルートの .env ファイルに書きます。.env ファイルを開くと、次のような設定が書かれています。

# 📁 .env(プロジェクトルートにある設定ファイル)

DB_CONNECTION=sqlite
# DB_HOST=127.0.0.1
# DB_PORT=3306
# DB_DATABASE=laravel
# DB_USERNAME=root
# DB_PASSWORD=

今回はそのままSQLiteを使います。SQLiteはファイル1つで動くデータベースで、追加のインストールが不要です。設定をそのまま変更せず進めましょう。

SQLiteのデータベースファイルは database/database.sqlite に保存されます。ファイルがなければ自動で作られます。


マイグレーションとは

マイグレーション? データベースのテーブル構造をコードで定義・管理する仕組み。変更履歴を残せるので、チームで同じDB構造を共有しやすい。 は、データベースのテーブル設計をコードで書いて管理する仕組みです。

テーブルとはExcelのシートのようなものです。

tasks テーブルのイメージ
┌────┬──────────────┬──────────┬───────┐
│ id │ title        │ body     │ done  │
├────┼──────────────┼──────────┼───────┤
│  1 │ 牛乳を買う   │          │ false │
│  2 │ 勉強する     │ 毎日少し │ false │
└────┴──────────────┴──────────┴───────┘

マイグレーションファイルはこのテーブルの設計書をPHPのコードで書いたものです。コードで管理することで「どのようなテーブル変更を行ったか」の履歴が残り、チームで開発するときに全員が同じ構造を再現できます。


マイグレーションファイルを作る

ターミナルで次のコマンドを実行します。

php artisan make:migration create_tasks_table

database/migrations/ フォルダの中に新しいファイルが作られます。ファイル名はコマンドを実行した日時をもとに自動で決まります(例:2025_04_30_000000_create_tasks_table.php)。

作られたファイルを開く

database/migrations/2025_XXXX_create_tasks_table.php を開くと次のようになっています。

<?php
// 📁 database/migrations/xxxx_create_tasks_table.php(自動生成直後)

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    // テーブルを作る処理(migrate コマンドで実行)
    public function up(): void
    {
        Schema::create('tasks', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
        });
    }

    // テーブルを削除する処理(rollback コマンドで実行)
    public function down(): void
    {
        Schema::dropIfExists('tasks');
    }
};

up() の中の $table->id() が主キー(自動採番のID)、$table->timestamps() が作成日時と更新日時のカラムです。

カラムを追加する

up() の中に、アプリに必要なカラムを追加します。$table->id();$table->timestamps(); の間に追加してください。

// 📁 database/migrations/xxxx_create_tasks_table.php
// up() メソッドの中を書き換える

public function up(): void
{
    Schema::create('tasks', function (Blueprint $table) {
        $table->id();                                    // ID(変更しない)
        $table->string('title');                         // ← 追加:タイトル
        $table->text('body')->nullable();                // ← 追加:内容(空でもOK)
        $table->boolean('done')->default(false);         // ← 追加:完了フラグ
        $table->timestamps();                            // 作成日時・更新日時(変更しない)
    });
}

よく使うカラムの種類をまとめました。

メソッド種類使い方の例
string('name')短い文字列タイトル、名前
text('body')長い文字列本文、メモ
integer('count')整数数量、年齢
boolean('active')true/falseフラグ
timestamps()日時2カラム作成日・更新日

->nullable() をつけると「空(NULL)でもOK」、->default(false) は「デフォルト値を false にする」という意味です。


マイグレーションを実行する

ファイルを作っただけではまだテーブルはできていません。次のコマンドで実際にテーブルを作ります。

php artisan migrate

ターミナルに Migrating: ... と表示されてから Migrated: ... になれば成功です。tasks テーブルができました。

間違えたときはロールバック

テーブルの設計を変えたいときは、次のコマンドでひとつ前の状態に戻せます。

php artisan migrate:rollback

down() に書いた処理(Schema::dropIfExists('tasks'))が実行されてテーブルが削除されます。マイグレーションファイルを修正してから再度 php artisan migrate を実行すれば、新しい設計でテーブルを作り直せます。


シーダーで開発用データを入れる

シーダー? データベースに初期データや開発用テストデータを流し込む仕組み。手動で入力しなくてもDBにデータを用意できる。 を使うと、コマンド一発で開発用のテストデータをDBに流し込めます。毎回手動で入力しなくて済むので、開発効率が上がります。

① シーダーファイルを作る

php artisan make:seeder TaskSeeder

database/seeders/TaskSeeder.php が作られます。

② シーダーにデータを書く

database/seeders/TaskSeeder.php を開き、run() メソッドを書き換えます。

<?php
// 📁 database/seeders/TaskSeeder.php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;

class TaskSeeder extends Seeder
{
    public function run(): void
    {
        // DB::table('テーブル名')->insert([データの配列])
        DB::table('tasks')->insert([
            [
                'title'      => '牛乳を買う',
                'body'       => null,
                'done'       => false,
                'created_at' => now(),
                'updated_at' => now(),
            ],
            [
                'title'      => 'Laravelを勉強する',
                'body'       => '毎日少しずつ',
                'done'       => false,
                'created_at' => now(),
                'updated_at' => now(),
            ],
            [
                'title'      => '掃除をする',
                'body'       => null,
                'done'       => true,
                'created_at' => now(),
                'updated_at' => now(),
            ],
        ]);
    }
}

③ DatabaseSeeder から呼び出す

database/seeders/DatabaseSeeder.php を開いてください。run() メソッドの中に TaskSeeder を追加します。

<?php
// 📁 database/seeders/DatabaseSeeder.php

namespace Database\Seeders;

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    public function run(): void
    {
        $this->call([
            TaskSeeder::class,  // ← この行を追加
        ]);
    }
}

④ シーダーを実行する

php artisan db:seed

Seeding: TaskSeeder と表示されれば成功です。

データが入ったか確認する

Tinker? Laravelに付属するコマンドラインのPHPインタープリタ。コードを直接入力してDBへの保存や取得をその場で試せる。 を使うとコマンドラインからデータを確認できます。

php artisan tinker

起動したら次のコードを入力して Enter を押してください。

DB::table('tasks')->get()

3件のタスクが表示されれば成功です。exit または Ctrl+C で終了できます。


まとめ

この回でやったこと:

  • database/migrations/ マイグレーション? データベースのテーブル構造をコードで定義・管理する仕組み。変更履歴を残せるので、チームで同じDB構造を共有しやすい。 ファイルを作り、tasks テーブルを設計した
  • php artisan migrate でテーブルを作成した
  • database/seeders/TaskSeeder.php にテストデータを書いた
  • php artisan db:seed でデータを流し込んだ
  • Tinker? Laravelに付属するコマンドラインのPHPインタープリタ。コードを直接入力してDBへの保存や取得をその場で試せる。 で投入されたデータを確認した

次回はいよいよ Eloquent? LaravelのORM(データベース操作ツール)。SQLを直接書かずにPHPのコードでデータを取得・保存できる。 を使って、このテーブルのデータをPHPのコードで読み書きします。