将子查询 SQL 转换为 Laravel 可能吗?

Convert Subquery SQL to Laravel possible?

是否可以更改此 SQL 使其适用于 Laravel?

SELECT  name, event,m.season_id, tm.played_pugs, active, m.created_at, datediff(now(),m.created_at)
FROM matchs m
LEFT OUTER JOIN seasons ON seasons.id = m.season_id
JOIN ( SELECT season_id, max(matchs.created_at) as MaxDate, count(season_id) as played_pugs
                  FROM matchs
                  GROUP BY season_id) tm on m.season_id = tm.season_id and m.created_at = tm.MaxDate
ORDER BY played_pugs descc>

这是我目前拥有的:

$seasons = DB::table('matchs')
    ->select('name', 'event', 'season_id', 'played_pugs', 'active', DB::raw('datediff(now(),created_at) as days'))
    ->join('seasons', 'seasons.id', '=', 'matchs.season_id', 'left outer')
    ->join(DB::raw('SELECT season_id, max(matchs.created_at) as MaxDate, count(season_id) as played_pugs FROM matchs GROUP BY season_id)'), '')
    ->orderBy('played_pugs','desc')
    ->get();

我也看不到带有 'played_pugs' 的值为 0 的值。我该如何解决这个问题。

这将生成您发布的确切查询。我已经使用单独的 Query Builder 对象构建了连接子查询,并使用 toSql() 方法获取生成的 SQL 字符串以使用 DB::raw() 注入,因为这样更易读并且它是 100 % 使用查询生成器语法构建。

$joinSubquery = DB::table('matchs')
    ->select('season_id', DB::raw('max(matchs.created_at) as MaxDate'), DB::raw('count(season_id) as played_pugs'))
    ->groupBy('season_id')
    ->toSql();

$seasons = DB::table('matchs m')
    ->select('name', 'event', 'm.season_id', 'tm.played_pugs', 'active', 'm.created_at', DB::raw('datediff(now(), m.created_at)'))
    ->leftJoin('seasons', 'season.id', '=', 'm.season_id', '')
    ->join(DB::raw('(' . $joinSubquery . ') tm'), function ($join)
    {
        $join->on('m.season_id', '=', 'tm.season_id');
        $join->on('m.created_at', '=', 'tm.MaxDate');
    })
    ->orderBy('played_pugs', 'desc')
    ->get();