LaravelのEloquent活用術まとめ!実務でよく使うテクニック集
生徒
「LaravelのEloquentって便利そうだけど、実務でよく使うテクニックってありますか?」
先生
「もちろんです。Eloquentはデータベース操作を簡単にするための便利な機能がたくさんあります。今日は初心者でも使いやすい実務向けのテクニックをまとめて紹介します。」
生徒
「具体的にどんなことができるんですか?」
先生
「リレーションの取得、条件検索、集計、更新や削除、さらに便利なメソッドなどを順番に解説します。」
1. 基本的なレコード取得
Eloquentではモデルを通してデータベースのレコードを簡単に取得できます。例えば、Userモデルを使って全てのユーザーを取得する場合です。
$users = User::all();
これだけで全ユーザーの情報を配列のように扱うことができます。条件を付けたい場合はwhereを使います。
$activeUsers = User::where('active', true)->get();
条件に合ったレコードだけを取得できるので、実務で非常によく使います。
2. リレーションを活用する
Eloquentではモデル同士のリレーションを定義することで、関連するデータを簡単に取得できます。例えば、PostとCommentの1対多リレーションです。
$post = Post::find(1);
$comments = $post->comments;
さらに、条件付きでリレーションを検索したい場合はwhereHasを使います。
$posts = Post::whereHas('comments', function($query) {
$query->where('approved', true);
})->get();
承認済みのコメントがある投稿だけを取得できます。
3. 集計やソートを活用する
レコードの件数を数えたり、平均値を取得したりすることも簡単です。
$userCount = User::count();
$averageAge = User::avg('age');
$recentPosts = Post::orderBy('created_at', 'desc')->get();
集計やソートを組み合わせると、実務でのレポート作成などに役立ちます。
4. レコードの更新と削除
取得したレコードはそのまま更新や削除が可能です。
$user = User::find(1);
$user->name = '新しい名前';
$user->save();
User::where('active', false)->delete();
条件を付けて一括削除することもでき、日常のメンテナンス作業でよく使われます。
5. Eager Loadingで効率化
リレーションを取得する際にN+1問題(データベースへのアクセスが増えすぎる問題)が起こることがあります。これを防ぐにはwithを使ったEager Loadingが有効です。
$posts = Post::with('comments')->get();
これにより、必要なリレーション情報をまとめて取得でき、処理が高速になります。
6. スコープを活用した再利用可能な条件
モデルにスコープを定義すると、よく使う条件を簡単に再利用できます。
class User extends Model {
public function scopeActive($query) {
return $query->where('active', true);
}
}
$activeUsers = User::active()->get();
これで、どこでもactive()を呼ぶだけでアクティブユーザーを取得できます。
7. ソフトデリートで安全に削除
削除したレコードを復元できるようにする場合は、ソフトデリートを使います。
use Illuminate\Database\Eloquent\SoftDeletes;
class Post extends Model {
use SoftDeletes;
}
$post->delete(); // 論理削除
Post::withTrashed()->get(); // 削除済みも含めて取得
$post->restore(); // 復元
データを誤って消してしまうリスクを減らすことができるため、実務で重宝します。
8. 便利なメソッド活用
Eloquentには便利なメソッドが多くあります。例えば、firstOrCreateやupdateOrCreateです。
$user = User::firstOrCreate(
['email' => 'test@example.com'],
['name' => 'テストユーザー']
);
存在しなければ作成し、存在すれば取得するという操作を1行で実現できます。