0

我正在 Laravel 4 中建立一个网站。我的数据库中有一个名为 Games 的表,其中包含游戏列表。默认情况下,我将这些游戏排序为:

$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);

显然 count($this->players) 是错误的,但我有点坚持这个。

谢谢。希望这一切都说得通!

:)

4

1 回答 1

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();

请注意,我们不能为COUNTto取别名,players也不能使用模型(没有办法JOIN)。

于 2013-10-24T07:18:26.363 回答