私は雄弁な方法で解決したいと思っている難しい問題に直面しましたが、私は本当に欲しくない生のSQLに入る必要があると思います。ここで私はこれまで持っているものです。Laravel 5.3のクエリ - 票の合計が異なる結果
Userモデル - ユーザーは多くの記事 IDを持つことができます|名前
投稿 - いくつかのカテゴリがあります。 id | user_id |タイトルなど...
スキル - これは多対多リレーションシップのピボットテーブルです(記事に関するskill_types) id | skill_type_id | post_id
スキルタイプ - これはユニークなスキルのリストです。 id: スラグ|タイトル|など。
投票 - 投票スキルテーブル
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;
}
ありがとうございます。 SQLはかなり簡単ですが、私は同意しますが、主な障害は最適なロジックを見つけ出すことです。答えをもっと詳しく説明できますか?私はまだパズルのこの部分に立ち往生しています。 –
上記のSQLは、skil_idと各スキルが何回使用されたかを示す結果セットを与えます。この結果を配列にスティックし、配列をソートして、上位10のスキルを返すことができます。 – faraday703