我正在 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) 是错误的,但我有点坚持这个。
谢谢。希望这一切都有意义!
:)
最佳答案
您需要手动JOIN
表格,然后SELECT COUNT(player.id)
、GROUP BY (game.id)
和按计数排序(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();
请注意,我们不能将 COUNT
别名为 players
,也不能使用模型(无法JOIN
)。
关于php - Laravel 4 - 数据排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19555259/