본문 바로가기

개발/laravel

[laravel 5.5/QueryBuilder] SubQuery

반응형

같은 테이블 데이터를 조인해서 id로 group by 하고 생성된 테이블 데이터의 기간 차이를 가져올 예정.

 

subquery에서 select 하는 querybuilder 가 존재하지 않으므로..

logs 테이블을 조건검색하는 sql문을 생성한다.

$sql = $this->logs()
            ->select('logs.id', 'logs.createdate', DB::raw('MIN(b.createdate) as nextdate'))
            ->leftJoin('logs as b', function($join) {
                $join->on('logs.id', '=', 'b.id');
                $join->on('logs.createdate', '<', 'b.createdate');
            })
            ->where(function($query) {
                $query->where('logs.pausedate', '<>', null)
                    ->orWhere('logs.unpausedate', '<>', null);
            })
            ->whereYear('logs.createdate', '=', date('Y'))
            ->groupBy('logs.id', 'logs.createdate')
            ->orderBy('logs.createdate');

생성한 sql을 테이블화 하고

$sql->getbaseQuery()로 laravel Eloquent에서 사용 가능한 쿼리 빌더를 가져온다.

mergeBinding으로 첫번째 쿼리와 두 번째 쿼리를 바인딩한다.

$result = DB::table(DB::raw("({$sql->toSql()}) as sub"))
    ->select(DB::raw("SUM(DATEDIFF(sub.nextdate, sub.createdate)) AS pauseperiod"))
    ->mergeBindings($sql->getbaseQuery())
    ->get()
    ->first();

반응형