我正在尝试在Laravel中创建一个仅向我提供latest
记录的关系。我有三个实体:Game
,Player
和Turn
。我需要能够在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(); // ???
}
欢迎任何帮助,谢谢!
您可以尝试此查询。希望能成功
$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();