【Laravel】union all で2つのテーブルのデータを結合

union all で2つのテーブルを結合する例。
union all は重複したデータも取得、重複したデータは1つだけ取得したい場合は union を使用する。

$builder_01 = Eloquent_01::select(
        DB::raw('"01" as type'),
        'id',
        'name',
        'status',
        DB::raw('null as status_02'),
        'created_at'
    );

$builder_02 = Eloquent_02::select(
        DB::raw('"02" as type'),
        'id',
        'name',
        'status',
        'status_02',
        'created_at'
    )
    ->with('db_table_name');

$user_unions = $builder_02
    ->unionAll($builder_01)
    ->orderBy('created_at', 'desc')
    ->paginate(20);

以下ざっくり解説

select

union 時に、両方のテーブルから取得するするカラムを合わせる必要がある。そのため、select 区で同じカラムを抽出するように調整する。

DB::raw('“01” as type') のように書くことで、テーブルを判別するカラムを追加したりできる。

片方のテーブルにしかないカラムを取得したい場合は、もう片方のテーブルで DB::raw('null as status_02') のようにカラムを追加してやればよい。

with

with で合わせて取得したいテーブルがあった場合、片方のテーブルでしかリレーションしてなくてもOK。 もちろん使うときは、存在する方でのみ呼び出すような制御は必要。