例えば、友達(friends)テーブルから年齢、従業員(employees)テーブルから年齢を抽出して統合(union)し、更に年齢でgroup byし、年齢別のカウントを求めるする方法
生のSQLはこんな感じ
SELECT
s.age,
COUNT(s.age) cnt
FROM
(
SELECT
f.name,
f.age
FROM
friends f
UNION
SELECT
e.name,
e.age
FROM
employyes e
)s
GROUP BY
s.age
Laravelのクエリビルダだとこう
- 友達テーブルから抽出
$f = Friend::from('friends as f')
->select(
'f.age'
);
- 従業員テーブルから抽出
$e = Employee::from('employees as e')
->select(
'e.age'
);
- 友達テーブルと従業員テーブルを統合
$s = $f->union($e);
- 統合したクエリをサブクエリにしてgroup byする
$records = DB::query()->fromSub($s, 's')
->select(
DB::raw('count(s.age) as cnt')
)
->groupBy('s.age')
->get();
困った時は、fromSub()で大抵はなんとかなる!