Laravelでカンタンなアプリを作ってMVCモデルを理解する

作るアプリの概要

機能: タスクの追加・表示・編集・削除

データ:tasks テーブル(id, title, completed)

URL構成

  • GET /tasks → タスク一覧を表示
  • POST /tasks → タスクを追加
  • GET /tasks/{id}/edit → タスクを編集
  • PUT /tasks/{id} → タスクを更新
  • DELETE /tasks/{id} → タスクを削除

開発の流れ

  1. Laravelプロジェクトを作成
  2. マイグレーションとモデルの作成
  3. ルーティング設定
  4. コントローラーの作成
  5. ビューの作成(Bladeテンプレート)

Laravelプロジェクトを作成

マイグレーションとモデルの作成

マイグレーションとは?
Laravelの マイグレーション(Migration) は、データベースのテーブル構造を コードで管理する仕組み です。
データベースを直接編集するのではなく、
マイグレーションファイルに テーブルの作成・変更のルールを記述 して、
php artisan migrate コマンドで実行すると、データベースが更新されます。

まず、タスク管理のためのマイグレーションファイルを作成します。

コマンドプロンプトを起動して、laravelフォルダまで移動して以下のコメントを実行

php artisan make:model Task -m

このコマンドで以下の2つが生成されます:

  • app/Models/Task.php(モデル)
  • database/migrations/YYYY_MM_DD_create_tasks_table.php(マイグレーション)

マイグレーションの編集

マイグレーションファイルを開いて、tasks テーブルの構造を定義します。

今回のテール部構造は以下のようにします。

カラム名データ型説明
idbigint (AUTO_INCREMENT)主キー(自動で増加)
titlestring (VARCHAR)タスクの名前
completedboolean (TINYINT)タスクの完了フラグ (true=完了, false=未完了)
created_attimestamp作成日時(自動で設定)
updated_attimestamp更新日時(自動で設定)

id(主キー)

  • 各タスクに一意の番号(ID)が振られる。
  • bigintAUTO_INCREMENT なので、新しいデータを入れるたびに増えていく。

title(タスクのタイトル)

  • タスクの名前を保存する。
  • string 型(VARCHAR 相当)なので、文字列を格納できる。

completed(完了フラグ)

  • タスクが完了したかどうかを true / false で管理。
  • デフォルトは false(未完了)。

timestamps()(作成日時・更新日時)

  • created_at(データが追加された日時)
  • updated_at(データが更新された日時)
  • Laravelが自動で管理する。

実際にファイルを編集する

database/migrations/YYYY_MM_DD_create_tasks_table.php を開き、up() メソッドを以下のように編集してください。

public function up()
{
    Schema::create('tasks', function (Blueprint $table) {
        $table->id();
        $table->string('title'); // タスク名
        $table->boolean('completed')->default(false); // 完了フラグ
        $table->timestamps(); // created_at, updated_at
    });
}

$table->id()の正体
$table->id();$table->bigIncrements('id') の省略形 です。
$table->bigIncrements('id');
bigIncrements() の特徴は
BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY を作成する。
・Laravelのマイグレーションでは デフォルトでAUTO_INCREMENT が有効 になる。

マイグレーションを実行

php artisan migrate

tasks テーブルがデータベースに作成される。

CREATE TABLE `tasks` (
    `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `title` VARCHAR(255) NOT NULL,
    `completed` TINYINT(1) NOT NULL DEFAULT 0,
    `created_at` TIMESTAMP NULL DEFAULT NULL,
    `updated_at` TIMESTAMP NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

実際はこんなSQLが実行されています。

マイグレーション実行前にphp artisan migrate --pretend で事前にSQLをチェックできます。

モデルの編集

モデル app/Models/Task.php を開いて、以下のように編集します。

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Task extends Model
{
    use HasFactory;

    protected $fillable = ['title', 'completed'];
}

これで、Task モデルを通じてタスクの作成・更新・取得ができるようになりました。

HasFactory とは?

HasFactoryLaravelのEloquentモデルにおいて、データを簡単に作成するための「ファクトリ機能」 を提供するトレイト(trait)です。
通常、データベースにレコードを追加するには Task::create([...]) のように手動でデータを作成する必要がありますが、ファクトリを使うと、テストデータを自動生成 できます。

テストデータを入れる

Laravel Tinkerを使って、テストデータを作成します

Laravel Tinker は、Laravel に組み込まれている REPL(Read-Eval-Print Loop) ツールで、データベースの操作やコードのテストを手軽に実行できる 対話型シェル です。

Tinker を起動

php artisan tinker

これで、Tinker が起動し、以下のような表示になります。

次のコードをいれると…

App\Models\Task::factory()->count(10)->create();

これだけで tasks テーブルにランダムな10件のデータが自動生成される!

実際に入っているか確認してみる

App\Models\Task::all();

実行結果

※phpAdminでも確認できます

controllerを作る

以下のコマンドを実行してください。

php artisan make:controller TaskController

app/Http/Controllers/TaskController.php が作成されます。

コントローラーに一覧表示の処理を追加

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Task;

class TaskController extends Controller
{
    public function index()
    {
        $tasks = Task::all(); // すべてのタスクを取得
        return view('tasks.index', compact('tasks'));
    }
}

  • Task::all();tasks テーブルからすべてのデータを取得。
  • return view('tasks.index', compact('tasks'));
    → 取得したデータをtasks/index.blade.php で表示。

ルーティングを設定する

Laravel の ルーティング(Routing) とは、「URL と処理を結びつける仕組み」 のことです。
例えば、example.com/users にアクセスしたときに、どの処理を実行するのかを決めるのがルーティングです。

use App\Http\Controllers\TaskController;

Route::get('/tasks', [TaskController::class, 'index']);

上記を追記してください。

/tasks にアクセスすると TaskController@index が実行されるようになります

ビュー(表示用のBladeテンプレート)を作成

resources/views/tasks/index.blade.php を作成し、以下のコードを追加してください。

このページでやったこと

  • マイグレーション でデータベースのテーブルを作成
  • Eloquentモデル でデータを操作
  • ファクトリ でテストデータを作成
  • コントローラー を使ってデータを取得&ビューに渡す
  • ルーティング でURLと処理をつなげる
  • Bladeテンプレート でデータを表示