0

生の mysql クエリを Laravel 4 のクエリ ビルダー、またはできれば Eloquent に移動したいと考えています。


セットアップ

  • ゲームの割引キーを格納するデータベース。
  • 割引キーは、各キー セットが 1 つのゲームに関連付けられているキー セットに格納されます (ゲームには複数のキーセットを含めることができます)。
  • 次のクエリは、管理ページで表示するために、キー セットと関連データのテーブルを返すことを目的としています。
  • 「これまでに使用されたキー」は、スケジュールされたイベントによって計算され、テーブルのログ エントリに定期的に保存/更新されますkeySetLogs。(カウントが変化したときにのみデータをログに記録するのは十分にスマートです)
  • 「使用されたキー」の最新の値を表示したいと考えています。これは、「グループあたり最大 n」の問題です。

生のクエリ

SELECT
    `logs`.`id_keySet`,
    `games`.`name`,
    `kset`.`discount`,
    `kset`.`keys_total`,
    `logs`.`keys_used`
FROM `keySets` AS `kset`
INNER JOIN
(
    SELECT
        `ksl1`.*
    FROM `keySetLogs` AS `ksl1`
    LEFT OUTER JOIN `keySetLogs` AS `ksl2`
        ON (`ksl1`.`id_keySet` = `ksl2`.`id_keySet` AND `ksl1`.`set_at` < `ksl2`.`set_at`)
    WHERE `ksl2`.`id_keySet` IS NULL
    ORDER BY `id_keySet`
)
AS `logs`
    ON `logs`.`id_keySet` = `kset`.`id`
INNER JOIN `games`
    ON `games`.`id` = `kset`.`id_game`
ORDER BY `kset`.`id_game` ASC, `kset`.`discount` DESC

keys_used注: ネストされたクエリは、ログから最新の値を取得します。このgreatest-n-per-groupコードは、この質問で説明されているように使用されます。

出力例:

+-----------+-------------+----------+------------+-----------+
| id_keySet | name        | discount | keys_total | keys_used |
+-----------+-------------+----------+------------+-----------+
|         5 | Test_Game_1 |   100.00 |         10 |         4 |
|         6 | Test_Game_1 |    50.00 |        100 |        20 |
|         3 | Test_Game_2 |   100.00 |         10 |         8 |
|         4 | Test_Game_2 |    50.00 |        100 |        14 |
|         1 | Test_Game_3 |   100.00 |         10 |         1 |
|         2 | Test_Game_3 |    50.00 |        100 |         5 |
...

質問)

KeySet、関係関数を設定して作成された Eloquent モデルがKeySetLogあります。Game

  1. クエリビルダーでネストされたクエリを作成するにはどうすればよいですか?
  2. クエリ全体を雄弁に書くことは可能ですか (手動で結合を書く必要はありません)?
4

1 に答える 1