2016-10-24 11 views
2

私は雄弁な方法で解決したいと思っている難しい問題に直面しましたが、私は本当に欲しくない生のSQLに入る必要があると思います。ここで私はこれまで持っているものです。Laravel 5.3のクエリ - 票の合計が異なる結果

  1. Userモデル - ユーザーは多くの記事 IDを持つことができます|名前

  2. 投稿 - いくつかのカテゴリがあります。 id | user_id |タイトルなど...

  3. スキル - これは多対多リレーションシップのピボットテーブルです(記事に関するskill_types) id | skill_type_id | post_id

  4. スキルタイプ - これはユニークなスキルのリストです。 id: スラグ|タイトル|など。

  5. 投票 - 投票スキルテーブル

IDに関連しています| skill_id

私がする必要があるのは、投票数のユーザーのトップ10スキルを取得することです。 これを行うには、名前でスキルをマージして投票数を集計し、投票数でソートしてトップ10を出力する必要があります。

おそらく私の脳はすでに疲れているでしょう。私が解決策を考え出すまで、他の人がそれを手伝ってくれるかもしれない。

マイソリューション:

public function getTopSkills($limit = 10, $offset = 0) 
{ 

    $results = DB::select('select skill_types.name as name, count(likes.id) as votes 
         FROM 
          skills 
         left join likes 
         on skills.id=likes.likeable_id 
         join posts on skills.item_id = posts.id 
         join users on posts.user_id = users.id 
         join skill_types on skill_types.id = skills.skill_type_id 
         where users.id = :userid 
         group by skill_types.name 
         order by votes desc 
         limit :limit 
         offset :offset', ['userid' => $this->id, 'limit' => $limit, 'offset' => $offset]); 
    return $results; 
} 

答えて

2

幸い、SQLを使用して、

SELECT skill_id, count(id) 
FROM VOTES 
group by skill_id 

思ったより簡単です次に、あなただけの代わりの名前を取得するために戻ってスキルタイプテーブルへのskill_idカラムネクタイを持っています数値ID

+0

ありがとうございます。 SQLはかなり簡単ですが、私は同意しますが、主な障害は最適なロジックを見つけ出すことです。答えをもっと詳しく説明できますか?私はまだパズルのこの部分に立ち往生しています。 –

+0

上記のSQLは、skil_idと各スキルが何回使用されたかを示す結果セットを与えます。この結果を配列にスティックし、配列をソートして、上位10のスキルを返すことができます。 – faraday703

関連する問題