如何使表演者雄辩的关系仅显示最新记录

问题描述 投票:0回答:1

我正在尝试在Laravel中创建一个仅向我提供latest记录的关系。我有三个实体:GamePlayerTurn。我需要能够在Game上创建关系以仅返回currentTurns

这是我的数据库:

Players
+--+--------+
|id|name    |
+--+--------+
|1 |John Doe|
|2 |Jane Doe|
|3 |John Roe|
+--+--------+

Turns
+--+-------+---------+----+-------------------+
|id|game_id|player_id|roll|created_at         |
+--+-------+---------+----+-------------------+
|1 |1      |1        |3   |2020-03-19 08:27:42|
|2 |1      |2        |5   |2020-03-19 08:27:46|
|3 |1      |3        |1   |2020-03-19 08:27:51|
|4 |1      |1        |6   |2020-03-19 08:28:05|
+--+-------+---------+----+-------------------+

Games
+--+--------+
|id|name    |
+--+--------+
|1 |Foobar  |
+--+--------+

最初,我会写一个原始的SQL查询,如下所示:

SELECT * FROM turns WHERE game_id = 1 GROUP BY player_id ORDER BY created_at DESC

[我发现自MySQL 5.7起,此behaviour has changed。因此,我发现无需在Laravel中禁用严格模式即可使用an approach

我当前的原始查询看起来像这样:

SELECT turns.* 
FROM turns
JOIN (
    SELECT player_id, max(created_at) as created_at FROM turns WHERE game_id = 1 GROUP BY player_id
) as latest_turns 
ON latest_turns.player_id = turns.player_id 
AND latest_turns.created_at = turns.created_at 
AND game_id = 1

我不确定这是否是最高效的方法,但我正在寻找在Game类上使用口才关系方法实现此目的的方法。

<?php

// ...

public function currentTurns(): HasMany
{
    return $this->turns(); // ???
}

欢迎任何帮助,谢谢!

php mysql laravel mysql-5.7
1个回答
0
投票

您可以尝试此查询。希望能成功

$fees_charges = DB::table('turn')
        ->join('games','games.id','=','turn.game_id')
        ->join('players','players.id','=','turn.player_id')
        ->select('turn.*')
        ->orderBy('id', 'desc')->first();
    print_r($fees_charges);
    exit();
© www.soinside.com 2019 - 2024. All rights reserved.