質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Eloquent

Eloquentとは、PHPフレームワークのLaravelに最初から含まれているORM(Object-relational mapping:オブジェクト関係マッピング)です。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

1回答

1018閲覧

eloquentでInnerJoin+サブクエリでの検索をする時の最も良い書き方について

motuo

総合スコア3027

Eloquent

Eloquentとは、PHPフレームワークのLaravelに最初から含まれているORM(Object-relational mapping:オブジェクト関係マッピング)です。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

1クリップ

投稿2017/11/06 09:29

###前提・実現したいこと
laravel5.5にて、下記のSQLをEloquentで書こうと考えました。

SQL

1SELECT 2 * 3FROM 4 `M_Unitprices` --単価マスタ 5 --対象日を見て、最も直近の単価マスターを取得したい 6 INNER JOIN ( 7 SELECT 8 MAX(TARGETDATE) AS TARGETDATE, 9 EMPLOYEECODE 10 FROM 11 `M_Unitprices` 12 WHERE 13 `targetDate` <= ? 14 GROUP BY 15 `employeeCode` 16 ) AS MU 17 ON `M_Unitprices`.`targetDate` = `MU`.`targetDate` 18 AND `M_Unitprices`.`employeeCode` = `MU`.`employeeCode`

このSQLをEloquentで実装した場合、私は下記の様にコードを書きました。

PHP

1 //サブクエリの内容を記述 2 $subQuery = DB::table('M_Unitprices')->select(DB::raw('max(targetDate) as targetDate,employeeCode')) 3 ->where('targetDate','<=',$workDate)->groupBy('employeeCode'); 4 //DB::rawにてサブクエリをSQL化 5 return M_Unitprice::join(DB::raw('('.$subQuery->toSql().') As MU') , 6 function($join) use ($subQuery) { 7 $join->on('M_Unitprices.targetDate', '=', 'MU.targetDate') 8 ->on('M_Unitprices.employeeCode', '=', 'MU.employeeCode') 9 ->addBinding($subQuery->getBindings(), 'join'); 10 })->get()

この記述により、欲しいレコードを抽出する事が出来たのですが、M_Unitprice::join(DB::raw('('.$subQuery->toSql().') As MU') という書き方はコードをSQLを直で書いているのと同じ感覚になるので、邪道ではないかと悩んでいます。
他に上記のSQLをEloquentでうまく書く良いやり方をご存知の方がいたら教えて頂けると嬉しいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

GroupByを使うなど複雑なクエリの場合は、SQL的に書く形になるかと思います。
ORMの形にする場合は、M_UnitpricesからM_UnitpricesへのHasOneの関係の物を作ると場合によっては簡潔にできるかもしれません

投稿2017/11/07 04:10

aro10

総合スコア4106

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

motuo

2017/11/07 05:09

ありがとうございます。 やはり、SQL的に書かざるを得ない様ですね。この回答を見てちょっと安心しました。 SQLがイメージできても、それをORMに落とし込むのは、中々、難しいですねぇ。
aro10

2017/11/07 05:22

Eloquentは、ORM+クエリビルダーとして複雑な事はSQLで書くという割り切りもあるので、ORMで出来ないことを回避できるという柔軟性と見てもいいかもしれません。 Laravelの他のORMとしては、Doctrineの物もメンテナンスされているみたいなので用途によっては使えるかもしれません。 [Laravel Doctrine](http://www.laraveldoctrine.org/)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問