[laravel]親子孫データの特定の条件の孫データを取得

php/laravel バックエンド


マスターデータでこの条件の物だけを取得したいときがあると思います。

(例)
ユーザー→購入履歴→商品マスター→商品区分

でひっかける場合特定の商品区分購入履歴が欲しい等でよく使われると思います。

外部キー(foreign_key)→通常はテーブル名+id
下記はテーブル構造にもよるのですが一例

        return $this->hasManyThrough(
            'App\Models\Product',// つなげる先のテーブルクラス
            'App\Models\PurchaseHistory',// 中間テーブルクラス
            'customer_id', // 中間テーブルの外部キー
            'id', // つなげる先のテーブルの外部キー
            'id', // 元テーブルのローカルキー
            'product_id' // つなげる先のテーブルのローカルキー
        );

この場合、商品マスターが何も指定しなくても一括で取れます。

中間テーブルの購入履歴カラムを追加したい場合や
商品区分名を追加したい場合
商品区分で特定したいので孫の条件を追加したい場合をそれぞれ下記に説明を追加します。

        return $this->hasManyThrough(
            'App\Models\Product',// つなげる先のテーブルクラス
            'App\Models\PurchaseHistory',// 中間テーブルクラス
            'customer_id', // 中間テーブルの外部キー
            'id', // つなげる先のテーブルの外部キー
            'id', // 元テーブルのローカルキー
            'product_id' // つなげる先のテーブルのローカルキー
        )
            ->select('*', 'purchase_history.buy_at') // 購入日を追加でselectで指定
            ->with('product_category') // 商品区分名の為のマスターをさらに追加
            ->where('product_category_id', '=', 1); // 孫の検索条件を追加

上記で親・子・孫の結合で、様々な条件追加や、取得方法ができると思います。
どうしても難しい場合はSQLで書いた方が早い場合もありますが、APIで取得する場合は便利な事も多かったりするので参考になれば!