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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Laravel 5

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

Q&A

1回答

725閲覧

Laravel 5.4 子のモデルの最新レコードの値を使って検索したい

panpan

総合スコア7

Laravel 5

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

0グッド

0クリップ

投稿2017/10/03 01:31

編集2022/01/12 10:55

Laravel 5.4で質問があります。

EloquentのModelAとModelBがあり、ModelAがModelBに対して1対多の関係(hasMany)となっています。

今、ModelAが所有するModelBの最新レコードの特定のカラム(columnA)が1になっているModelAを抽出したいのですが、どのようにすればQueryを構築できるかご教授いただけると助かります。

よろしくお願いします。

(追記)

取り急ぎ、試したことを2つ追加させていただきます。いずれも最新レコードだけが抽出対象とならず、すべてのModelBから抽出されてしまいました。

1)リレーションの追加

modelAの定義に以下を追加。

public function latest_modelB() { return $this->hasOne('App\Models\Eloquent\modelB', 'projectId', 'id')->orderBy('created_at', 'desc')->take(1); }

そして、hasWhereを使ってみました。

$query->hasWhere('latest_modelB', function($subquery){ $subquery->where('columnA', 1); })

2)leftjoin()を使用

$query->leftJoin('modelB_no_table', function ($join) { $join->on('modelB_no_table.modelAId', '=', 'modelA_no_table.id') ->orderBy('id', 'desc')->take(1); }) ->where('modelB_no_table.columnA', 1);

まだ、上手くはいってないのですが、modelBのmax('id')をサブクエリのwhereで使えないかなと思い、試行錯誤していますが、うまくSQLを構築できません。

試したことは以上になります。引き続き、よろしくお願いします。

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

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

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

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

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

m.ts10806

2017/10/03 02:42

プログラムコード(およびエラーメッセージ)は```で囲ってください。(わからなければ質問編集画面でコード部分を選択し<code>ボタンを押してください)正しく反映されているかどうかは質問編集画面のプレビューを見ながら編集していってください。
t_obara

2017/10/03 03:31

不明な点は、SQL文そのもの自体も不明なのか、それはわかるが、そのSQLをEloquentで組み立てることが不明なのでしょうか?
panpan

2017/10/03 05:39

ご返信ありがとうございます。Eloquentで組み立てることが不明です。
panpan

2017/10/03 05:42

mts10806様>```で囲みました。不慣れなもので申し訳ありません。
t_obara

2017/10/03 06:07

組み立てることが不明とのことであれば、想定するSQL文をご提示されるとよろしいのではないでしょうか。
guest

回答1

0

SQLはわかっていてEloquentで組み立てる方法が不明ということなので、デバッグ方法の例として、
クエリを発行する前後で以下のように記述するとEloquentが発行したSQLクエリが確認できるので、
その情報を元に、$query変数の内容やリレーション設定、hasWhereの内容がおかしくないかを検証していけば解決できるかと思います。

\DB::enableQueryLog(); $query->hasWhere('latest_modelB', function($subquery){ $subquery->where('columnA', 1); }) dd(\DB::getQueryLog());

Laravel 5.4 Eloquent:リレーション

投稿2017/10/08 10:52

aro10

総合スコア4106

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問