1つのテーブルを複数のテーブルと結合したい【Laravel10】

Laravel,PHP

1つのテーブルを2つの異なるテーブルに対して結合したいケースがあったのでLaravelで実装してみました

こういうテーブルがあった(前提)

1. ユーザテーブル(User)

idname
1藤沢たかし
2伊藤えりか

2. 商品テーブル(Item)

user_idは出品者のユーザid

3. 注文テーブル(Order)

user_idは購入者のユーザid

で、こう言う感じに出力したかった

要は商品テーブルと注文テーブルで異なるuser_idを持っていて、そのそれぞれのテーブルに対してユーザテーブルを結合したい

で、上のテーブルの様に一つのレコードに出品者と購入者ユーザの名前を出力したいってわけ

もうちょっと詳しく

まずは、単純に商品テーブル注文テーブルを結合してみると、こうなる

この時点のSQLクエリーはこんな感じ

SELECT 
 i.id, 
 i.title, 
 i.user_id AS item_user_id, 
 o.user_id AS order_user_id
FROM 
 item AS i
INNER JOIN order AS o ON i.id = o.item_id

それぞれのテーブルのユーザIDが出力されてるけど、あくまでIDが表示されてるだけで氏名はわからない

ユーザIDと氏名の情報を持ってるユーザテーブルをさらに結合する必要がある

しかも、item.user_idorder.user_idそれぞれに

結論

結論を言うと、上で書いたクエリーを副問合せSubQueryとしてFrom句に指定して、

こんな感じでそれぞれのテーブルに対して結合してやると目標の出力が得られる

SELECT 
 sub.item_id, 
 sub.title, 
 u1.name AS '出品者名', 
 u2.name AS '購入者名'
FROM 
 (SubQuery)AS sub
 LEFT JOIN user AS u1 ON sub.item_user_id = u1.id
 LEFT JOIN user AS u2 ON sub.order_user_id = u2.id

Laravelでやる場合はこんな感じ

LaravelにはfromSubというメソッドが用意されているので、こう書ける

DB::query()
 ->fromSub($SubQuery, 'sub')
 ->leftJoin('user AS u1', 'sub.item_user_id', '=', 'u1.id')
 ->leftJoin('user AS u2', 'sub.order_user_id', '=', 'u2.id')
 ->get();