🐥

【Laravel】with, join, selectを組み合わせてデータを取得

2022/12/25に公開

はじめに

Laravelでのwith, join, selectを組み合わせたデータ取得について書きます。
この組み合わせでデータ取得したのは初めてだったのでメモがてら記事にすることにしました。
モデルのリレーションや細かい文法などの話は省略して、
どう組み合わせて取得したかということに絞って書かせていただきます。

取得したいデータ

以下のようなリレーションのデータを取得したいとします。データは例です。
Monosnap 無題のスプレッドシート - Google スプレッドシート 2022-12-13 21-53-48.png

説明

  • missions, projects, tasks, main_teamsテーブルはリレーションがありwithで取得したい
  • main_teams, sub_teams, workersテーブルはリレーションはなく、joinで結合して取得したい
  • missionsテーブルは特定のidのデータのみ取得したい
  • missions, sub_teams, workersテーブルのデータは特定のカラムのみ取得したい

コード

コメントアウトが補足説明になります。

        Mission::with([
            // projesテーブルから取得するカラムを特定する
            // id,project_id,name, deadlineだけ取得したい
            'project.task:id,project_id,name, deadline',
            // main_teamsテーブルをsub_teams, workersとjoinする
            'project.task.main_team'
            =>function($query){
            // sub_teamsとjoin
            $query->join('sub_teams',function($join){
                $join->on('main_teams.sub_team_id','=','sub_teams.id');})
            // workersとjoin
            ->join('workers',function($join){
                $join->on('main_teams.team_worker_id','=','workers.id');})
            // 取得したいカラムを特定し重複削除する
            ->distinct()
            ->select(
                // main_teamsのデータは全て取得する
                'main_teams.*',
                // sub_teamsのnameカラムだけ取得したい
                // nameカラムは他のテーブルでもありカラム名が被るので一意の命名
                'sub_teams.name as user_name',
                // 上記sub_teamsと同様
                'workers.name as worker_name',
            );}
        ])
        // missionsテーブルではidが1, bossがデデデ大王のデータに絞りたい
        ->where(['missions.id'=>1, 'missions.boss'=>'デデデ大王')
        // missionsテーブルで取得するのはtarget, reasonカラムのみにしたい
        ->get(['target','reason']);
    }

参考

https://r17n.page/2019/11/28/laravel-eager-load-and-select-columns-with-nested-relations/

以上です。

Discussion