重构 Laravel 查询

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

我已经构建了一个查询,我试图了解如何在一个查询中实现相同的目标。我对 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

php laravel laravel-5 laravel-5.7
2个回答
1
投票

首先,你应该尝试编写 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();

0
投票

基本上,我会将查询简化为其 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

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.