どうも!Hiroyukiです^^
前回、いいね!機能の実装方法について詳しく説明させて頂きました。
(興味ある方は、下記記事をご覧下さい〜)
●「いいね!機能の実装方法」詳しく解説〜PHP/Laravelを使って
https://qiita.com/Hiroyuki-Hiroyuki/items/e5cb3b6595a7e476b73d
今回は、そこから派生させて
ユーザが「いいね!」をゲットした総数を表示させる方法!!
を解説させて頂きます〜
やりたいこと
今回やりたいことを、ボクのオリジナルアプリの例でいうと、
以下の画像の各ユーザのチャンネルの右上に
「 ○(数字) いいね! 」
という、緑色のBootstrapのバッジがあると思いますが、
「この数を表示させたい」というシンプルな内容です。
前回は、各動画(コンテンツ)ごとに「いいね!」された数を表示させる方法を解説したのですが、
今回は
「ボク(各ユーザ)は一体、合計で何ポイントの「いいね!」を貯めたのかなぁ〜〜〜??」
ということが、一瞬で分かる表示を設けたい場合に、どうすればいいかを解説しますっ!
前回と同じく、前提として、下記の画像のような
ユーザ:コンテンツで、「1対多」の関係
があるようなサービスが既に作られている前提で、話を進めて行きま〜す!
この「いいね!」機能では、各ユーザが各ムービー(コンテンツ)に「いいね!」をする形です。
僕が作っているのが、下記サイトの、動画を使ったSNSサービスみたいなものなので、
コンテンツは 「movies(動画)」 となっていますが、
ツイッタークローンなど作成の場合も、実装方法は全く同じだと思いますので、
是非ぜひ参考にしてみてくださーい^^
※Twitterクローンの場合は、
コンテンツが「つぶやき(tweets,micropostsなど)」に変わるだけですね!
ボクのオリジナルサービス 【いいね!機能実装済み】
●YouTubeまとめ × コミュニケーション
http://youtubematome.herokuapp.com
「いいね!」総数の表示方法を解説!
ユーザ(チャンネル)一覧を表示しているview
@foreach ($users as $key => $user)
@php
$movies=$user->movies;
$total=0;
foreach ($movies as $key => $movie){
$total += $movie->favorite_users()->count();
}
@endphp
<div>{{ $user->name }}</div>
//・・・(中略)・・・
@endforeach
もともとが、ユーザ(チャンネル)一覧で、各userを表示させる為に、
foreach文を利用していました。
そのforeach文の中で、userが所有している全てのmovie(コンテンツ)を取り出さないといけないため、
更にその先で、foreach文を利用している「入れ子構造」になっています。
本来、こういう処理はコントローラーの中に書くべきなんですが、
ユーザ(チャンネル)一覧表示のため、viewにforeach文を置いているので
必然的にviewの中にこのような処理を持ってきています。
(※もっと綺麗な書き方・やり方があれば、ぜひ教えて下さい!😓)
そして、
$movies=$user->movies;
で、各ユーザの持っているコンテンツ(動画)を全て取り出します!
(もちろん、Userモデルにmovies()関数を定義しておく必要があります)
その後、foreach文を使い、コンテンツ(movies)を1つ1つ抽出しますっ
そしてそして、各コンテンツを「いいね!」しているユーザを数えるのが下記のコード!
$total += $movie->favorite_users()->count();
このfavorite_users()関数は、コンテンツ(Movie)のモデルで定義しているものですね
Movie.php
class Movie extends Model
{
//・・・中略・・・
public function user()
{
return $this->belongsTo(User::class);
}
public function favorite_users()
{
return $this->belongsToMany(User::class,'favorites','movie_id','user_id')->withTimestamps();
}
}
各movieの「いいね!」の数を数えたものを、$totalに足していき、
下記のように表示させれば万事完了〜!
ユーザ(チャンネル)一覧を表示しているview
@foreach ($users as $key => $user)
@php
//・・・(中略 上に同じ)・・・
@endphp
<div class="text-right">
<span class="badge badge-pill badge-success">{{ $total }} いいね!</span>
</div>
<div>{{ $user->name }}</div>
//・・・(中略)・・・
@endforeach
ボクも、「いいね!」ゲット数を表示させるのに、自分で考えて結構苦労したんですが
(ググり方が下手なのか、同様の内容のドキュメントが出てこずで、てこずりましたね💦)
コードを見るとシンプルですねぇ!
是非、参考にしてみて下さい。
Hiroyukiでした〜^o^