我已经构建了一个查询,我试图了解如何在一个查询中实现相同的目标。我对 Laravel 和学习还相当陌生。无论如何,有人可以帮助我了解如何实现我所追求的目标?
$activePlayerRoster = array();
$pickupGames = DB::table('pickup_games')
->where('pickupDate', '>=', Carbon::now()->subDays(30)->format('m/d/Y'))
->orderBy('pickupDate', 'ASC')
->get();
foreach ($pickupGames as $games) {
foreach(DB::table('pickup_results')
->where('pickupRecordLocatorID', $games->recordLocatorID)
->get() as $activePlayers) {
$activePlayerRoster[] = $activePlayers->playerID;
$unique = array_unique($activePlayerRoster);
}
}
$activePlayerList = array();
foreach($unique as $playerID) {
$playerinfo = DB::table('players')
->select('player_name')
->where('player_id', $playerID)
->first();
$activePlayerList[] = $playerinfo;
}
return $activePlayerList;
pickup_games
校验和ID
挑个日子
开始时间
时间结束
游戏时长
获胜队
记录定位器ID
取货ID
1546329808471 2019年1月1日 上午 08:03 上午 08:53 50分钟 2 f47ac0fc775cb5793-0a8a0-ad4789d4 216
pickup_results
id 校验和ID 玩家ID 团队 比赛结果 拣货订单 拾取记录定位器ID
1 1535074728532 425336395712954388 1 损失 0 be3532dbb7fee8bde-2213c-5c5ce710
首先,你应该尝试编写 SQL 查询,然后将其转换为 Laravel 的数据库代码。
如果性能对您来说并不重要,那么可以在一个查询中完成,如下所示:
SELECT DISTINCT players.player_name FROM pickup_results
LEFT JOIN players ON players.player_id = pickup_results.playerID
WHERE EXISTS (
SELECT 1 FROM pickup_games
WHERE pickupDate >= DATE_FORMAT(SUBDATE(NOW(), INTERVAL 30 DAY), '%m/%d/%Y')
AND pickup_results.pickupRecordLocatorID = recordLocatorID
)
这里我假设你知道你在用这个日期比较做什么,因为它对我来说看起来很奇怪。
现在,让我们将其转换为 Laravel 的代码:
DB::table('pickup_results')
->select('players.player_name')->distinct()
->leftJoin('players', 'players.player_id', '=', 'pickup_results.playerID')
->whereExists(function ($query) {
$query->select(DB::raw(1))
->from('pickup_games')
->where('pickupDate', '>=', Carbon::now()->subDays(30)->format('m/d/Y'))
->whereRaw('pickup_results.pickupRecordLocatorID = recordLocatorID');
})
->get();
基本上,我会将查询简化为其 SQL 变体,以直接了解其核心。 查询的本质是
select `x` FROM foo WHERE id IN (
select distinct bar.id from bar join baz on bar.id = baz.id);
这在 Eloquent 中可以解释为:
$thirtyDaysAgo = Carbon::now()->subDays(30)->format('m/d/Y');
$playerIds = DB::table('pickup_games')
->select('pickup_games.player_id')
->join(
'pickup_results',
'pickup_results.pickupRecordLocatorID',
'pickup_games.recordLocatorID')
->where('pickupDate', '>=', $thirtyDaysAgo)
->orderBy('pickupDate', 'ASC')
->distinct('pickup_games.player_id');
$activePlayers = DB::table('players')
->select('player_name')
->whereIn('player_id', $playerIds);
//>>>$activePlayers->toSql();
//select "player_name" from "players" where "player_id" in (
// select distinct * from "pickup_games"
// inner join "pickup_results"
// on "pickup_results"."pickupRecordLocatorID" = "pickup_games"."recordLocatorID"
// where "pickupDate" >= ? order by "pickupDate" asc
//)
从结果查询中,最好将连接重构为
pickup_games
和 pickup_results
的 Eloquent 模型之间的关系。这将有助于进一步简化$playerIds
。