質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

1回答

7447閲覧

laravelでいいねが多い順にランキング表示させたい

moko888

総合スコア20

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

1クリップ

投稿2019/02/05 09:01

laravelでvueを利用し、いいね機能を実装しました。現在、投稿をいいねが多い順にランキング表示させようとしているのですが、うまくいきません。ソースコードは以下になります。

posts:投稿
likes:いいね
/app/Http/Controllers/PostController.php

laravel

1public function index() 2 { 3     $user = \Auth::user(); 4 $id = Auth::id(); 5 6 $posts = Post::orderBy('likes', 'desc')->paginate(20); 7 8 $posts->load('user', 'tags','likes'); 9 return view('top', [ 10 'posts' => $posts, 11 'user' => $user 12 ]); 13 }

/resources/views/top.blade.phpの投稿表示部分

laravel

1@foreach($posts as $post) 2 <div class="col-6 col-sm-4 col-lg-3" style="padding:8px;"> 3 <div class="card"> 4 <a href="{{ route('posts.show', $post->id) }}"> 5 <img class="card-img-top img-responsive center-block" src="{{ asset('storage/image/'.$post->image) }}" alt=""> 6 </a> 7 <div class="card-body text-center"> 8 <h5> 9 <a class="text-secondary" href="{{ route('posts.show', $post->id) }}"> 10 {{ $post->title }} 11 </a> 12 </h5> 13 <h6> 14 <a class="text-secondary" href="{{ route('users.show', $post->user_id) }}"> 15 {{ $post->user->name }} 16 </a> 17 </h6> 18 <h6> 19 @foreach($post->tags as $tag) 20 <a href="{{ route('posts.index', ['tag_name' => $tag->tag_name]) }}"> 21 #{{ $tag->tag_name }} 22 </a> 23 @endforeach 24 </h6> 25 {{ count($post->likes) }} <!--いいねの数表示--> 26 </div> 27 </div> 28 </div> 29@endforeach

View内で{{ count($post->likes) }}を記述することでlikesの数は表示できました。
エラーは表示されないのですが、順番が変わっていない状況です。
他に追記すべきものがあれば指摘していただくと助かります。回答よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/02/05 13:11

テーブル定義とどのような数がどのように入っているかをご提示いただかないと回答は難しいかと思います。
moko888

2019/02/06 03:03

追記が遅れてしまいすみません。 withCountメソッドを使うことで昇順にすることができました。
guest

回答1

0

ベストアンサー

count($post->likes)で数が求められていると言うことなので、likesはリレーションなのだと思います。likesというカラムが実際にデータベース上にあるわけでないので、orderByに使うことはできません。

(こういう場合に普通はエラーになりそうなものですが、試してみたところでは、mysqlではlikesというカラムはないというエラーになり期待通りの結果でしたが、sqliteでは特にエラーにならず単に無視されましたので、使用するデータベースによるようです)

このような場合は、マニュアル「Eloquent:リレーション」の「関連するモデルのカウント」のところで解説されているwithCountメソッドを使います。

リレーション結果の件数を実際にレコードを読み込むことなく知りたい場合は、withCountメソッドを使います。件数は結果のモデルの{リレーション名}_countカラムに格納されます。

この{リレーション名}_countカラムは副問い合わせを用いて展開されるので、orderByでの指定に用いることができます。したがって以下のようにすればいいのではないかと思います。

php

1$posts = Post::withCount('likes')->orderBy('likes_count', 'desc')->paginate(20);

投稿2019/02/06 01:35

crhg

総合スコア1175

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

moko888

2019/02/06 03:02

sqliteを使用してたためエラーが出なかったのですね... withCountメソッドを使うことで昇順にすることができました!ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問