2016-10-24 49 views
2

我遇到了一個棘手的問題,我想解決雄辯的方式,但我想我需要進入原始的SQL,我不是真的想要。以下是我迄今爲止:Laravel 5.3查詢 - 不同結果與總票數

  1. 用戶模式 ​​- 用戶可以有很多帖子 ID |名稱

  2. 的帖子 - 可以有幾個類別 ID | user_id | title ...等

  3. 技能 - 這是多對多關係(skill_types與帖子相關)的樞軸表 ID | skill_type_id | post_id

  4. 技能類型 - 這是獨特技能的列表。 id | slug |標題|等等。

  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