LoginSignup
4
2

More than 3 years have passed since last update.

ユーザが「いいね!」をゲットした総数を表示させるのは、どうやるの?

Posted at

どうも!Hiroyukiです^^

前回、いいね!機能の実装方法について詳しく説明させて頂きました。

(興味ある方は、下記記事をご覧下さい〜)

●「いいね!機能の実装方法」詳しく解説〜PHP/Laravelを使って

https://qiita.com/Hiroyuki-Hiroyuki/items/e5cb3b6595a7e476b73d

今回は、そこから派生させて

ユーザが「いいね!」をゲットした総数を表示させる方法!!

を解説させて頂きます〜

やりたいこと

今回やりたいことを、ボクのオリジナルアプリの例でいうと、
以下の画像の各ユーザのチャンネルの右上に

「 ○(数字) いいね! 」

という、緑色のBootstrapのバッジがあると思いますが、
「この数を表示させたい」というシンプルな内容です。
スクリーンショット 2019-09-22 16.35.28.png

前回は、各動画(コンテンツ)ごとに「いいね!」された数を表示させる方法を解説したのですが、
今回は

「ボク(各ユーザ)は一体、合計で何ポイントの「いいね!」を貯めたのかなぁ〜〜〜??」

ということが、一瞬で分かる表示を設けたい場合に、どうすればいいかを解説しますっ!

前回と同じく、前提として、下記の画像のような

ユーザ:コンテンツで、「1対多」の関係

があるようなサービスが既に作られている前提で、話を進めて行きま〜す!
スクリーンショット 2019-09-22 8.04.11.png

この「いいね!」機能では、各ユーザが各ムービー(コンテンツ)に「いいね!」をする形です。
僕が作っているのが、下記サイトの、動画を使った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^

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2