#05 Laravelを始めよう

EloquentでDBを操作する

前回、 マイグレーション? データベースのテーブル構造をコードで定義・管理する仕組み。変更履歴を残せるので、チームで同じDB構造を共有しやすい。 でテーブルを作りデータを入れました。今回はそのデータをPHPのコードで読み書きする方法、 Eloquent? LaravelのORM(データベース操作ツール)。SQLを直接書かずにPHPのコードでデータを取得・保存できる。 を学びます。


Eloquentとは

Eloquent? LaravelのORM(データベース操作ツール)。SQLを直接書かずにPHPのコードでデータを取得・保存できる。 はLaravelの ORM? データベースのテーブルをプログラム上のオブジェクトとして扱えるようにする技術。SQLを直接書かなくてもDBを操作できる。 です。 SQL? データベースを操作するための言語。「このテーブルからデータを取得して」などの命令を書く専用の文法がある。 を直接書く代わりに、PHPのメソッドでデータを操作できます。

// SQLを直接書く場合(わかりにくい)
DB::select('SELECT * FROM tasks WHERE done = 0 ORDER BY created_at DESC');

// Eloquentを使う場合(読みやすい)
Task::where('done', false)->orderBy('created_at', 'desc')->get();

Eloquentのほうが読みやすく、間違いも起きにくいです。


モデルを作る

モデル? データベースのテーブルと対応するクラス。テーブルへの読み書きをオブジェクトとして扱えるようにする。MVCの「M」。 は1つのテーブルと対応するPHPのクラスです。tasks テーブルに対しては Task モデルを作ります。

ターミナルで実行します。

php artisan make:model Task

app/Models/Task.php が自動で作られます。

$fillable を設定する

作られたファイルを開き、$fillable プロパティを追加します。

<?php
// 📁 app/Models/Task.php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Task extends Model
{
    // 一括で書き込みを許可するカラムを指定
    protected $fillable = ['title', 'body', 'done'];
}

$fillable には「外部からまとめて書き込んでよいカラム名」を配列で指定します。ここに書いていないカラムはフォームから送られてきても無視されます。セキュリティのための設定です。


データを取得する

次のコードは app/Http/Controllers/TaskController.php などのコントローラーの中で使います。ファイルの先頭付近に use App\Models\Task; を忘れずに書いてください。

// 📁 app/Http/Controllers/TaskController.php の先頭
use App\Models\Task;

全件取得

$tasks = Task::all();
// → tasks テーブルの全レコードを取得

条件をつけて取得

// 完了していないタスクだけ
$tasks = Task::where('done', false)->get();

// タイトルの昇順で並べる
$tasks = Task::orderBy('title')->get();

// 作成日時の降順で最新5件
$tasks = Task::latest()->take(5)->get();

1件だけ取得

// IDで1件取得(見つからなければ404エラー)
$task = Task::findOrFail(1);

// 条件で最初の1件を取得
$task = Task::where('title', '牛乳を買う')->first();

findOrFail() はIDが存在しないとき自動的に「404 Not Found」のエラーページを表示します。自分でエラー処理を書かなくてよいので便利です。


データを作成する

$task = Task::create([
    'title' => '新しいタスク',
    'body'  => 'やること',
    'done'  => false,
]);

create() に配列を渡すと、DBに保存してから保存されたモデルを返します。$fillable に指定したカラムだけ保存されます。


データを更新する

// まずIDで1件取得する
$task = Task::findOrFail(1);

// プロパティを変更して保存
$task->title = '修正したタイトル';
$task->save();

複数のカラムをまとめて更新するには update() が便利です。

$task = Task::findOrFail(1);
$task->update(['done' => true]);

データを削除する

$task = Task::findOrFail(1);
$task->delete();

コントローラーでまとめて使う

実際のコントローラーでEloquentを使う全体像を見てみましょう。

<?php
// 📁 app/Http/Controllers/TaskController.php

namespace App\Http\Controllers;

use App\Models\Task;          // ← Taskモデルをインポート
use Illuminate\Http\Request;

class TaskController extends Controller
{
    // タスク一覧を表示
    public function index()
    {
        $tasks = Task::where('done', false)
                     ->orderBy('created_at', 'desc')
                     ->get();

        return view('tasks.index', ['tasks' => $tasks]);
        // 'tasks' という名前でビューに渡す
    }

    // 特定のタスクを1件表示
    public function show($id)
    {
        $task = Task::findOrFail($id);

        return view('tasks.show', ['task' => $task]);
    }
}

ビューでモデルのデータを表示する

コントローラーから渡された $tasks はEloquentモデルのコレクション(一覧)です。各カラムにはプロパティとしてアクセスできます。

<!-- 📁 resources/views/tasks/index.blade.php -->
@foreach ($tasks as $task)
    <div>
        <h2>{{ $task->title }}</h2>

        @if ($task->body)
            <p>{{ $task->body }}</p>
        @endif

        <p>作成日: {{ $task->created_at->format('Y/m/d') }}</p>
    </div>
@endforeach

$task->title のようにして、テーブルのカラム名をそのままプロパティ名として使えます。$task->created_at は日付オブジェクトなので .format('Y/m/d') で「2025/05/07」のような形式に変換できます。


Tinkerで動作を確認する

Tinker? Laravelに付属するコマンドラインのPHPインタープリタ。コードを直接入力してDBへの保存や取得をその場で試せる。 を使えば、コードを書かずにEloquentを試せます。

php artisan tinker

起動したら次のように入力してみてください。

# 全件取得
App\Models\Task::all()

# 未完了のタスクだけ取得
App\Models\Task::where('done', false)->get()

# 新規作成
App\Models\Task::create(['title' => 'テスト', 'done' => false])

# ID=1のタスクを完了に更新
$t = App\Models\Task::find(1)
$t->update(['done' => true])

exit で終了できます。


まとめ

この回でやったこと:

  • app/Models/Task.php を作り、$fillable でカラムを指定した
  • Task::all()where()findOrFail() でデータを取得した
  • Task::create()update()delete() でデータを操作した
  • コントローラーから view() でビューにデータを渡した
  • ビューで $task->title のようにカラムの値にアクセスした

次回はフォームを使ってユーザーの入力を受け取る方法と、 バリデーション? フォームに入力されたデータが正しい形式かをチェックする処理。「メールアドレスの形式か」「空欄でないか」などを検証する。 を学びます。