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

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

新規登録して質問してみよう
ただいま回答率
85.47%
Laravel 6

Laravel 6は、オープンソースなPHPのフレームワーク。Webアプリケーションの開発に適しており、バージョン6はLTSです。5.8での向上に加えて、セマンティックバージョニングの採用やLaravel Vaporとのコンパチビリティなどが変更されています。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

842閲覧

Laravelでランキングサイトで検索機能を追加。検索した後にランキングの値が変わってしまう。

haya1996

総合スコア4

Laravel 6

Laravel 6は、オープンソースなPHPのフレームワーク。Webアプリケーションの開発に適しており、バージョン6はLTSです。5.8での向上に加えて、セマンティックバージョニングの採用やLaravel Vaporとのコンパチビリティなどが変更されています。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2022/06/29 11:48

人気ランキングサイトを作成しています。
検索機能は、実装出来ました。
しかしエラーも出ず、検索も出来ていますが、
順位(rank)だけが引き継がれず、全員1位になってしまいます。(他のデータは、ちゃんと反映される。)
どのようにすれば、引き継がれるのか教えて頂きたいと思い質問しました。
よろしくお願いします。

FighterController <?php namespace App\Http\Controllers; use Illuminate\Http\Request; //Fighterモデルをインポート use App\Fighter; //Likeモデルをインポート use App\Like; (省略) // DBをインポート use DB; class FighterController extends Controller { //トップページ public function index(Request $request) { //いいねのカウント、いいねが多い順に並び替え、順位を付ける $fighters_date = Fighter::query() ->selectRaw('fighters.*') ->addSelect(DB::raw('count(likes.user_id) as likes_count')) ->addSelect(DB::raw('rank() over (order by count(likes.user_id) desc) as rank')) ->leftJoin('likes', 'fighters.id', '=', 'likes.fighter_id') ->groupBy('fighters.id') ->orderByRaw('count(likes.user_id) desc'); //検索機能 $keyword = $request->input('keyword'); //ユーザーが検索したら if(!empty($keyword)) { // 選手名を検索 $fighters_date->where('fighter_name', 'LIKE', "%{$keyword}%"); } $fighters = $fighters_date->get(); return view('fighters.index',[ 'title' => '格闘家人気ランキング', 'fighters' => $fighters, 'keyword' => $keyword, ]); }
index.blade.php (省略) <form method = "GET" action = "{{ route('fighters.index') }}"> <input type = "text" name = "keyword" value = "{{ $keyword }}" placeholder = "選手名検索"> <input type = "submit" value = "検索"> </form> (省略)
検索後の$fightersの中身 index.blade.php Illuminate\Database\Eloquent\Collection {#1230 ▼ #items: array:1 [▼ 0 => App\Fighter {#1238 ▼ #fillable: array:4 [▶] #connection: "mysql" #table: "fighters" #primaryKey: "id" #keyType: "int" +incrementing: true #with: [] #withCount: [] #perPage: 15 +exists: true +wasRecentlyCreated: false #attributes: array:9 [▼ "id" => 5 "fighter_name" => "那須川 天心" "image" => "photos/Xv0gk3zVPCbU341krqEdKZm5F3OOs4daTXP1AkTh.jpg" "image_quote" => "RISE公式サイトより引用" "account" => "https://twitter.com/TeppenTenshin" "created_at" => "2022-06-26 16:22:51" "updated_at" => "2022-06-26 16:22:51" "likes_count" => 0 "rank" => 1 ] #original: array:9 [▶] #changes: [] #casts: [] #dates: [] #dateFormat: null #appends: [] #dispatchesEvents: [] #observables: [] #relations: [] #touches: [] +timestamps: true #hidden: [] #visible: [] #guarded: array:1 [▶] } ] }

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

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

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

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

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

guest

回答1

0

ベストアンサー

php

1<?php 2 3namespace App\Http\Controllers; 4 5use Illuminate\Http\Request; 6use App\Fighter; 7use DB; 8 9class FighterController extends Controller 10{ 11 public function index(Request $request) 12 { 13 $keyword = $request->input('keyword'); 14 15 $fighters = DB::query() 16 ->fromSub( 17 Fighter::query() 18 ->selectRaw('fighters.*') 19 ->addSelect(DB::raw('count(likes.user_id) as likes_count')) 20 ->addSelect(DB::raw('rank() over (order by count(likes.user_id) desc) as rank')) 21 ->leftJoin('likes', 'fighters.id', '=', 'likes.fighter_id') 22 ->groupBy('fighters.id'), 23 'main') 24 ->orderByRaw('likes_count') 25 ->when($keyword, function ($query) use ($keyword) { 26 $query->where('fighter_name', 'LIKE', "%{$keyword}%"); 27 }) 28 ->get(); 29 30 return view('fighters.index', [ 31 'title' => '格闘家人気ランキング', 32 'fighters' => $fighters, 33 'keyword' => $keyword, 34 ]); 35 } 36}

投稿2022/06/29 14:55

編集2022/06/30 13:53
phper.k

総合スコア3923

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

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

haya1996

2022/06/30 08:29

回答ありがとうございます。 私のやり方が悪いのか、 エラーメッセージが出ました。 Call to undefined method Illuminate\Database\Eloquent\Builder::query() 原因は、->query()の部分なのかなと思い調べましたがエラー変わらず。
phper.k

2022/06/30 09:10 編集

->query() とるか ->toSql() にする
haya1996

2022/06/30 12:19

すみません。 ->query()を取っても、 ->toSql()にしても以下のエラーが出て来ました。 Call to undefined method Illuminate\Database\MySqlConnection::from()
phper.k

2022/06/30 13:41

つきっきりでやるわけにもいかんので、こんなクエリが生成されるように試行錯誤してください select * from ( select fighters.id, count(likes.user_id), rank() over (order by count(likes.user_id) desc) from fighters left join likes on fighters.id = likes.fighter_id group by fighters.id order by count(likes.user_id) desc ) as main where fighter_name like '%%'
phper.k

2022/06/30 13:54

取り急ぎ回答修正 サンプルデータあるわけじゃないし、質問者が用意されているわけでもないので、動作確認はしてません
haya1996

2022/06/30 14:40

勉強になりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問