経緯
2つのテーブルを結合して、left_joinするテーブルの項目をまとめて1行で取得したい。
例えば、以下のようなテーブルがあった場合、table_bのnameを1行で取得したい
[table_a]id |
1 |
2 |
id | a_id | name |
1 | 1 | A |
2 | 1 | B |
3 | 2 | C |
イメージとしては、こんな感じ。
table_a.id | table_b.name |
1 | A,B |
2 | C |
手順
Laravelの書き方的には、これで取得可能
$quer = TableA::query()
->select([
'id',
DB::raw('string_agg(test_b.name), \',\') as names')
])
->leftJoin('table_b', function($join) {
$join->on('table_a.id', '=', 'table_b.a_id')
})
->groupBy('table_a.id');
ポイントは、2つ。
・まとめたいカラム名でグループ化する。
・string_aggを使って、「,」区切りでまとめる。
他の項目も取りたい場合は、上のクエリをサブクエリ化してあげればOK
補足:型が合わない場合
castして型を文字列に合わせてあげればOK。
取りたい値が、日付とか、数値とかだとこのやり方で
DB::raw('string_agg(cast(test_b.name as VARCHAR), \',\') as names')