第16回: ORM入門(Eloquent) — SQLを書かずにDBを操作する

章: 第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 のように直感的に関連データを取得する方法です。

Related Articles