left_joinするテーブルの項目をまとめて1行で取得したい

経緯

2つのテーブルを結合して、left_joinするテーブルの項目をまとめて1行で取得したい。

例えば、以下のようなテーブルがあった場合、table_bのnameを1行で取得したい

[table_a]
id
1
2
[table_b]
ida_idname
11A
21B
32C

イメージとしては、こんな感じ。

table_a.idtable_b.name
1A,B
2C

手順

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')

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です