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

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

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

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

Eloquent

Eloquentとは、PHPフレームワークのLaravelに最初から含まれているORM(Object-relational mapping:オブジェクト関係マッピング)です。

Q&A

解決済

1回答

625閲覧

「Model A をフォローしている && Model Bをフォローしている」という条件に当てはまるユーザーを取得したい。

teto277

総合スコア1

Laravel

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

Eloquent

Eloquentとは、PHPフレームワークのLaravelに最初から含まれているORM(Object-relational mapping:オブジェクト関係マッピング)です。

0グッド

0クリップ

投稿2020/10/08 14:49

実現したいこと

「ゲーマーに人気なデバイスランキング」を知ることができるサイトをLaravelで作っています。

現在「PUBGをプレイしている人に人気のデバイスランキング」を表示するための処理を作っているのですが、わからない部分があるので質問します。

ランキングを作るためにwithCountでデバイスのフォロワー数をカウントしながらデバイス一覧を取得しようと思うのですが、この時**「PUBGをプレイしているユーザー」**という条件つきでフォロワー数をカウントしたいです。

分かりやすく言い換えると、(PUBGをフォローしている && デバイスをフォローしている)←こんなユーザーをカウントしたいです。

どのように処理を書けばいいか教えてください。

前提

「Userモデル」は「Gameモデル」「Deviceモデル」とそれぞれリレーションしています。

  • ユーザーは自身がプレイしているゲームをフォローしています。
  • ユーザーは自身が使用しているデバイスをフォローしています。

modelUser

1public function game_followings(){ 2 return $this->belongsToMany(Game::class, 'game_follow', 'user_id', 'game_id')->withTimestamps(); 3} 4 5public function device_followings(){ 6 return $this->belongsToMany(Device::class, 'device_follow', 'user_id', 'device_id')->withTimestamps(); 7}

試したこと

こんな風に実装できそうだなと、考えてみましたがDeviceモデル内でどのような処理をすれば良いのか分からず...。

Controller

1$query = Device::withCount('pubg_followers')->orderBy('pubg_followers_count', 'desc'); 2 3$devices = $query->get();

モデル

Device

1public function pubg_followers{ 2 // pubgをフォローしている&&デバイスをフォローしている という人を取得したい 3}

補足情報(バージョンなど)

Laravel 6.0

SQLiteを使用

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

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

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

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

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

guest

回答1

0

自己解決

コントローラー内でクエリビルダを使い、withCountと同じような動作を再現しました。

Controller

1$devices = Device::query() 2 ->selectRaw('devices.*, (select count(*) from users inner join device_follow on users.id = device_follow.user_id inner join game_follow on users.id = game_follow.user_id where devices.id = device_follow.device_id and game_follow.game_id = '.$game->id.') as followers_count') 3 ->orderBy('followers_count', 'desc') 4 ->get();

投稿2020/10/11 15:34

編集2020/10/11 15:36
teto277

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問