0

Laravel 4 で Web サイトを構築しています。DB に、ゲームのリストを含む Games というテーブルがあります。デフォルトでは、これらのゲームを次のように並べ替えています。

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

ユーザーは、現在プレイしているゲームを選択できます。これらのレコードは、game_id と user_id を格納する Players というテーブルに格納されます。

私が作成したいくつかの関連モデル:

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

にエイリアスをCOUNT作成playersすることはできず、モデルを使用することはできません ( への方法はありませんJOIN)。

于 2013-10-24T07:18:26.363 に答える