php - Laravel 4 - 数据排序

标签 php mysql sql laravel laravel-4

我正在 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/

相关文章:

sql - 如何设计一个将属性合并到库存产品中的销售数据库?

php - 使用 createQueryBuilder 在 doctrine2 中使用 LIMIT ( setMaxResults ) 更新查询不起作用

sql - 忽略 Django ORM 查询中的基本模型

php - xajax扩展列表查询

MySQL 可能进行团队对团队比赛,其中一名玩家可以属于多个团队

MySQL 查询 - 1 列上的多个 WHERE 子句

mysql - 加入来自同一个表的三个查询

sql - 对一些sql帮助不大

php - 当条目具有\n 时修复 LOAD DATA INFILE

PHP OOP 与 Javascript