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

时间:2015-05-29 10:54:54

标签: php laravel mariadb

是否可以更改此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();

此外,我无法通过“play_pugs'那个有0的价值了。我该如何解决这个问题。

1 个答案:

答案 0 :(得分:0)

这将生成您发布的确切查询。我使用单独的Query Builder对象构建了join子查询,并使用toSql()方法使用DB::raw()来生成要生成的SQL字符串,因为它以这种方式更具可读性并且使用查询生成器语法。

$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();