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