2017-04-04 91 views
0

我有一個資源表和一個resources_votes表,每次用戶都喜歡[vote_id 1]或不喜歡[vote_id 2]資源。現在我需要檢索從最喜歡到最少的一個訂購的所有資源信息,並且由於當我使用->with('votes')時資源具有許多resources_votes,它將返回一個對象數組,其中每個resource_votes都與資源ID相關。Laravel:通過計數ID字段關係的訂單查詢

有沒有一種方法可以算出一個資源有多少正面投票[vote_id =2],用這個計數添加一個字段,並將查詢次數從大多數投票減少到少投票?

PD:這是與resources_votes關係的資源對象的例子,在那裏,你可以看到票陣列和票號,我需要計算,並根據順序:

{ 
      "id": 2, 
      "name": "aspernatur", 
      "image": "http://lorempixel.com/480/480/?31738", 
      "author": "Max Thiel", 
      "created_by": 6, 
      "reviewed_by": "Mr. Emiliano Frami", 
      "lang_id": 2, 
      "resource_type_id": 1, 
      "status": "Borrado", 
      "resource_type": "Imagen", 
      "platforms": [], 
      "classifications": [], 
      "votes": [ 
       { 
       "id": 2, 
       "user_id": 2, 
       "resource_id": 2, 
       "vote_id": 1 
       }, 
       { 
       "id": 29, 
       "user_id": 1, 
       "resource_id": 2, 
       "vote_id": 2 
       }, 
       { 
       "id": 24, 
       "user_id": 12, 
       "resource_id": 2, 
       "vote_id": 1 
       }, 
      ] 
      }, 

回答

1

你可以用預先加載得到它這樣

$resources = Resource::withCount(['votes' => function ($query) { 
    $query->where('vote_id', '=', '2'); //count positive votes only 
}])->get(); 

這將返回一個名爲votes_count列。您需要調用該列來顯示計數。

+0

按照你的說法工作,tks! – Miguelopezv

+0

有沒有一種方法可以檢索正面和負面的計數?我試着創建兩個'withCount',但一個覆蓋另一個。有沒有辦法創建一個'votes_count'行和'negative_votes_count'行? – Miguelopezv

0

您可以使用雄辯的訪問者。

創建下面的自定義字段和功能模型內

protected $appends = ['positiveVotesCounter']; 

然後,創建下面的函數來檢索您的自定義數據。

function getPositiveVotesCounterAttribute() { 
    $totalPositiveVotes = 0; 
    foreach($this->votes as $vote) { 
     if($vote['id'] == 2) { 
      $totalPositiveVotes++; 
     } 
    } 

    return $totalPositiveVotes; 
} 

更多信息可以在這裏找到: https://laravel.com/docs/5.4/eloquent-mutators

祝你好運!