2013-10-24 47 views
0

我在Laravel 4中構建了一個網站。我在我的數據庫中有一個名爲Games的表格,其中包含遊戲列表。默認情況下,我正在對這些遊戲進行排序:Laravel 4 - 排序數據

$games = Game::orderBy('title', 'ASC')->paginate(20); 

用戶可以選擇他們當前正在玩的遊戲。這些記錄存儲在一個名爲Players的表中,該表存儲game_id和user_id。

幾個相關機型的我已創建:

class Game extends Eloquent { 

    public function players() 
    { 
     return $this->hasMany('Player'); 
    } 

} 

class User extends Eloquent { 

    public function players() 
    { 
     return $this->hasMany('Player'); 
    } 

} 

class Player extends Eloquent { 

    public function game() 
    { 
     return $this->belongsTo('Game'); 
    } 

    public function user() 
    { 
     return $this->belongsTo('User'); 
    } 

} 

我想要做的是,能夠通過最流行的(最總玩家)遊戲遊戲進行排序,以便在遊戲列表中可以查看通過這種方式。我已經嘗試了以下內容,但這只不過是黑暗中的刺,因爲我對PHP框架和Laravel非常陌生。

$games = Game::orderBy(count($this->players), 'DESC')->paginate(20); 

明顯的計數($ this-> players)是錯誤的,但我有點卡在這一個。

謝謝。希望這一切都合情合理!

:)

回答

0

您需要JOIN表手動然後SELECT COUNT(player.id)GROUP BY (game.id)ORDER BY COUNT(player.id)

你最終的查詢應該是這樣的:

SELECT game.*, COUNT(player.id) AS players 
FROM game 
LEFT JOIN player 
    ON player.game_id = game.id 
GROUP BY player.id 
ORDER BY players 

與Laravel查詢生成器生成,這是非常簡單的:

DB::table('game') 
    ->leftJoin('player', 'player.game_id', '=', 'game.id') 
    ->groupBy('player.id') 
    ->orderBy(DB::raw('COUNT(player.id)')) 
    ->select('game.*') 
    ->get(); 

請注意,我們不能別名COUNTplayers,我們不能使用模型(沒辦法JOIN)。