1つのテーブルを複数のテーブルと結合したい【Laravel10】
1つのテーブルを2つの異なるテーブルに対して結合したいケースがあったのでLaravelで実装してみました
こういうテーブルがあった(前提)
1. ユーザテーブル(User)
id | name |
---|---|
1 | 藤沢たかし |
2 | 伊藤えりか |
2. 商品テーブル(Item)
id | user_id | title |
---|---|---|
1 | 1 | カルティエの時計 |
2 | 2 | Play Station5 |
3. 注文テーブル(Order)
id | item_id | user_id |
---|---|---|
1 | 1 | 2 |
2 | 2 | 1 |
で、こう言う感じに出力したかった
item_id | title | 出品者名 | 購入者名 |
---|---|---|---|
1 | カルティエの時計 | 藤沢たかし | 伊藤えりか |
2 | Play Station5 | 伊藤えりか | 藤沢たかし |
要は商品テーブルと注文テーブルで異なるuser_idを持っていて、そのそれぞれのテーブルに対してユーザテーブルを結合したい
で、上のテーブルの様に一つのレコードに出品者と購入者ユーザの名前を出力したいってわけ
もうちょっと詳しく
まずは、単純に商品テーブルと注文テーブルを結合してみると、こうなる
id | title | item_user_id | order_user_id |
---|---|---|---|
1 | カルティエの時計 | 1 | 2 |
2 | Play Station5 | 2 | 1 |
この時点の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_idとorder.user_idのそれぞれに
結論
item_id | title | 出品者名 | 購入者名 |
---|---|---|---|
1 | カルティエの時計 | 藤沢たかし | 伊藤えりか |
2 | Play Station5 | 伊藤えりか | 藤沢たかし |
結論を言うと、上で書いたクエリーを副問合せ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();
ディスカッション
コメント一覧
まだ、コメントがありません
新たにPostされたDocs
: ツール関連
キーボードを銀軸から赤軸に買い替えた話
約3年半前、仕事で使うキーボードとしてARCHISS ProgresTouchの ...: スマホ
楽天モバイルがおすすめできない人の特徴とは?
楽天モバイルの最強プランをおすすめできない人の特徴を簡単にまとめてみました また ...: システム開発
なぜスクラムがつらいのか?開発現場が疲弊するのか?スクラムに対する違和感と共に原因を考えてみた
今ではどこの開発現場に行っても、やれスクラムスクラムと、まるでスクラムでもやって ...: Laravel
1つのテーブルを複数のテーブルと結合したい【Laravel10】
1つのテーブルを2つの異なるテーブルに対して結合したいケースがあったのでLara ...: Laravel
Laravelで複数画像アップロード時のvalidateを指定【Laravel10】
jQuery - Image Uploaderを使って、フォームから複数の画像を ...HashMap
created_by
はやぴ
Web/アプリ開発エンジニア
Sierにてお堅いB向けのソフトウェア開発を経て、現在はC向けのWebやアプリを中心に開発しています。
Utilities