Laravel 5.2でブログの記事一覧を作っています。
記事には「Like」ボタンが有り、押すと押したユーザーIDと記事IDが中間テーブル(post_like)に記録されます。
記事一覧を表示時にその数をカウントして表示しようと考えています。
1ページにつき30記事程度のリストが表示され、単純にカウント処理をそれぞれにつけると30クエリ発生します。
with() を使えれば良いのですが今回の中間テーブルには Model がありません。
そこで whereIn() を用いて1ページ分の各PostのLike数を1回のクエリで取得してしまうことにしました。
php
1$posts = Post::all()->paginate(30); 2$idSst = $posts->pluck('id')->toArray(); // 1ページ分のPostのidのみ抽出 3$likes = DB::table('post_like') 4 ->select('post_id', DB::raw('COUNT(*)')) 5 ->whereIn('post_id', $idSet) 6 ->groupBy('post_id') 7 ->get();
あとは $post->likes とした時にその記事のLike数が表示されるようにひも付けました。
$arrLikes には ['記事ID' => like数] の形でデータが入っているものとします。
php
1foreach($posts as &$post){ 2 $post->likes = $arrLikes[$post->id]; 3} 4unset($post)
機能はするのですが強引に見えます。
Relation を設定していないテーブルの情報を with() のようにして紐付けるのに良い方法はないのでしょうか?
あなたの回答
tips
プレビュー