はじめに
「リレーション先のレコードは使わないけど、取得したレコードの数は見たい」という状況が稀にあります
自分はリレーション先のカラムをidにしView側でCountしていましたが、これをModelだけで実現できるwithCount
メソッドに感動したので解説していきます
withCountメソッドの基本
withCount
メソッドは、リレーションシップのレコード数をカウントし、結果に追加するために使用されます
例えば、Userモデルが複数の投稿(posts)を持っている場合、各ユーザーの投稿数をカウントして取得できます
これは非常に便利です
基本的なwithCountの使用
ユーザーモデルとポストモデルが1対多の関係にある場合、以下のようにwithCount
メソッドを使用します
モデルの定義
public function posts()
{
return $this->hasMany(Post::class);
}
クエリの使用例
$users = User::withCount('posts')->get();
foreach ($users as $user) {
echo $user->name . ' has ' . $user->posts_count . 'posts.';
}
このクエリにより、各ユーザーのposts_count
プロパティに投稿数が格納されます
複数リレーションシップのカウント
withCount
メソッドは、複数のリレーションシップを同時にカウントすることもできます
$users = User::withCount(['posts', 'comments'])->get();
foreach ($users as $user) {
echo $user->name . ' has ' . $user->posts_count . ' posts and ' . $user->comments_count . ' comments.';
このクエリでは、**各ユーザーのposts_count
とcomments_count
プロパティに、それぞれの投稿数とコメント数が格納されます
条件付きカウント
特定の条件に基づいてカウントすることも可能です
$users = User::withCount(['posts' => function ($query) {
$query->where('status', 'published');
}])->get();
foreach ($users as $user) {
echo $user->name . ' has ' . $user->posts_count . ' published posts';
}
このクエリでは、status
がpublished
の投稿のみをカウントします
まとめ
withCount
メソッドを使用することで、Eloquentモデルにおける関連データのカウントが非常に簡単になります
このメソッドは、データの分析や表示において強力なツールとなり、クエリの効率性を向上させます
すくなくともViewでCountさせるという手間は省けると思います
ぜひプロジェクトで活用してみてください
参考リンク