Eloquent ORMとは
LaravelにはEloquent(エロクアント)と呼ばれる強力なORM(Object-Relational Mapping)が組み込まれています。ORMとは、データベースのテーブルをPHPのクラス(モデル)として扱う仕組みです。生のSQLを書く代わりに、PHPのメソッドチェーンでデータ操作ができるため、コードが読みやすく保守性も高まります。
この記事では、Eloquentの基本的な使い方をステップごとに紹介します。
モデルの作成
まずはArtisanコマンドでモデルを生成しましょう。-mオプションを付けると、マイグレーションファイルも同時に作成されます。
php artisan make:model Post -m
生成された app/Models/Post.php は次のようになっています。
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
// 一括代入を許可するカラム
protected $fillable = ['title', 'body', 'user_id'];
}
Eloquentは規約に従って、Post モデルが posts テーブルに対応していると自動で認識します。テーブル名を変えたい場合は $table プロパティで指定できます。
基本的なCRUD操作
レコードの取得
use App\Models\Post;
// 全件取得
$posts = Post::all();
// 主キーで1件取得(見つからない場合は例外)
$post = Post::findOrFail(1);
// 条件を指定して取得
$posts = Post::where('user_id', 1)
->orderBy('created_at', 'desc')
->get();
// 最初の1件だけ取得
$post = Post::where('title', 'like', '%Laravel%')->first();
レコードの作成
// createメソッドで一括作成($fillable の設定が必要)
$post = Post::create([
'title' => 'Eloquent入門',
'body' => 'ORMは便利です。',
'user_id' => 1,
]);
レコードの更新・削除
// 更新
$post = Post::findOrFail(1);
$post->update(['title' => '更新後のタイトル']);
// 削除
$post->delete();
リレーション(関連付け)
Eloquentの真価はリレーションにあります。テーブル間の関係をモデルのメソッドとして定義するだけで、関連データを直感的に扱えます。
1対多(hasMany / belongsTo)
「1人のユーザーが複数の投稿を持つ」関係を定義します。
// app/Models/User.php
public function posts(): \Illuminate\Database\Eloquent\Relations\HasMany
{
return $this->hasMany(Post::class);
}
// app/Models/Post.php
public function user(): \Illuminate\Database\Eloquent\Relations\BelongsTo
{
return $this->belongsTo(User::class);
}
定義後は次のように関連データへアクセスできます。
$user = User::findOrFail(1);
// そのユーザーの全投稿を取得
$posts = $user->posts;
// 投稿の作者名を取得
$post = Post::findOrFail(1);
echo $post->user->name;
多対多(belongsToMany)
「投稿は複数のタグを持ち、タグも複数の投稿に属する」場合は belongsToMany を使います。中間テーブル(post_tag)が必要です。
// app/Models/Post.php
public function tags(): \Illuminate\Database\Eloquent\Relations\BelongsToMany
{
return $this->belongsToMany(Tag::class);
}
// タグの同期(中間テーブルを自動管理)
$post->tags()->sync([1, 2, 3]);
// タグ一覧の取得
foreach ($post->tags as $tag) {
echo $tag->name;
}
N+1問題とEager Loading
リレーションを使う際によく起こるのが N+1問題 です。投稿一覧をループしながら各投稿の著者を取得すると、投稿の数だけSQLが発行されてしまいます。
// ❌ N+1問題が起きる例(100件あれば101回クエリが走る)
$posts = Post::all();
foreach ($posts as $post) {
echo $post->user->name; // ここで毎回クエリ発行
}
これを防ぐには with メソッドによる Eager Loading を使います。
// ✅ Eager Loadingで2回のクエリにまとめる
$posts = Post::with('user')->get();
foreach ($posts as $post) {
echo $post->user->name; // クエリは追加発行されない
}
複数のリレーションをまとめてロードすることもできます。
$posts = Post::with(['user', 'tags'])->get();
まとめ
Eloquent ORMを使うことで、データベース操作がシンプルで読みやすいコードになります。
| 機能 | メソッド |
|---|---|
| 全件取得 | all() |
| 条件付き取得 | where()->get() |
| 作成 | create() |
| 更新 | update() |
| 削除 | delete() |
| Eager Loading | with() |
まずは基本的なCRUDとリレーションを押さえておけば、Laravelアプリ開発の大部分に対応できます。次のステップとして、スコープやアクセサ・ミューテタといった高度な機能にも挑戦してみてください。