章: 第2章: データベース応用
SELECT * FROM posts WHERE id = ? — これを毎回書かなくて済む方法がある
PDOで直接SQLを書くと、取得・作成・更新・削除のたびに似たようなクエリを書き続けることになります。テーブルの構造が変わればクエリも直していかなければなりません。
EloquentはLaravelのORMで、DBとモデルクラスを紐づけることでSQLを意識せずオブジェクト操作でDBアクセスを書ける仕組みです。
Eloquentの基本実装
<?php
use Illuminate\Database\Eloquent\Model;
class Post extends Model {
protected $fillable = ['title', 'body', 'user_id'];
}
// 取得
$post = Post::find(1);
echo $post->title;
// 作成
Post::create(['title' => '新しい記事', 'body' => '本文', 'user_id' => 1]);
生PDO vs Eloquent
| 操作 | 生PDO | Eloquent |
| IDで取得 | $stmt->prepare('SELECT...WHERE id=?') |
Post::find(1) |
| 条件絞り込み | WHERE active=1 AND role=? |
Post::where('active', 1)->where('role', 'admin')->get() |
| 作成 | INSERT INTO posts (...) |
Post::create([...]) |
| 更新 | UPDATE posts SET ... WHERE id=? |
$post->update(['title' => '新タイトル']) |
| 削除 | DELETE FROM posts WHERE id=? |
$post->delete() |
チェックポイント:
$fillableに記載したカラムしかcreate()/fill()で一括代入できません。これがマスアサインメント脆弱性を防ぐ仕組みです。
よく使うEloquentの操作
<?php
// 一覧取得
$posts = Post::all();
// 条件付き取得
$published = Post::where('status', 'published')
->orderBy('created_at', 'desc')
->limit(10)
->get();
// 存在確認
$exists = Post::where('slug', 'my-post')->exists();
// ファーストオアフェイル(見つからなければ404例外)
$post = Post::findOrFail(1);
// 更新
$post->update(['title' => '更新タイトル']);
// 削除
$post->delete();
チェックポイント:
Post::all()は全件取得するため、レコードが多いテーブルではget()にページネーションを組み合わせてください。
まとめ & 次のステップ
- EloquentはDBとモデルクラスを紐づけ、SQL不要でDBアクセスを書ける
$fillableの設定でマスアサインメント脆弱性を防ぐwhere()/orderBy()/limit()のメソッドチェーンで柔軟なクエリが作れる
次回はEloquentリレーションを学びます。テーブル間の関連を定義し、$post->user のように直感的に関連データを取得する方法です。