Я пытаюсь создать в 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. Поэтому я нашел подход , который работает без необходимости отключения строгого режима в Laravel.
Мой текущий необработанный запрос выглядит так:
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
Я Не уверен, что это наиболее эффективный способ, но я ищу способы достижения этого с помощью метода отношений Eloquent в Game
классе.
<?php
// ...
public function currentTurns(): HasMany
{
return $this->turns(); // ???
}
Любая помощь приветствуется, спасибо!