【Laravel】UNION + order by + ページネーション

Laravel
mcmurryjulieによるPixabayからの画像

概要

Laravelでのクエリにて、UNIONせざるを得なく、そうするとorder byで並び替える必要があり、最終的に画面に表示する際にはページネーションを考える必要がある場合、その通りに実装してもエラーが出てしまったので備忘録を残します!

サンプルコード

$queryA = DB::table('table_a AS ta')
 ->select(
  DB::raw('1 AS sort_1')
  ,ta.id AS sort_2
  ,ta.*
 );

$queryB = DB::table('table_b AS tb')
 ->select(
  DB::raw('2 AS sort_2')
  ,tb.ymdhm AS sort_2
  ,tb.*
 );

// union
$query = $queryA->unionAll($queryB);

// orderByがあるとpaginate()が使えないので自前でpaginatorを作成
$totalCount = (clone $query)->count();
$result = DB::query()->fromSub($query, 'sub')
 ->orderBy('sort_1')
 ->orderBy('sort_2')
 ->skip($countForPage * (($page ?? 1) -1))
 ->take($countForPage)
 ->get();

$paginator = new LengthAwarePaginator($result, $totalCount, $countForPage, $page);

オススメ

コメント

タイトルとURLをコピーしました