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

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

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

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

Q&A

解決済

3回答

1377閲覧

laravel DBクエリについて

yuuuui

総合スコア59

Laravel 5

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

0グッド

0クリップ

投稿2018/04/23 03:30

フローとして、

1.ordersテーブルから全件取得。 2.全件取得したordersのuser_idを配列で取得 3.配列で取得したuser_idをforeachで絞り込み、再度ordersテーブルから取得。 4.3.のデータを使用して処理を実行
ordersテーブル id //primaryKey user_id created_at updated_at

PHP

1//1 2$orders = DB::table('orders')->get(); 3//2 4$userIds = $orders->map(function ($item) { 5 return $item->user_id; 6 })->unique()->toArray(); 7//3 8foreach( $userIds as $userId) { 9 $ordersByUserId = DB::table('orders')->where('user_id', '=', $userId)->get(); 10 //4 ~省略~ 11 . 12 . 13 . 14}

1.と3.の処理が無駄にDBへアクセスしている状態になってしまっています。
1.で全件取得したデータから同じ形のデータを作成するような処理に変更できないでしょうか。
最終的には3.のデータ($ordersByUserId)を使用したいです。

情報不足等ありましたらご指摘をよろしくお願いします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

もちろん今の処理は全部間違ってるので
LaravelならまずEloquentとリレーションを調べる。
ordersからではなくusersから始めて
「このUserの持つOrder」という形でデータを取って来れる。

//一つ以上のorderを持つユーザー $users = User::has('orders')->get(); foreach($users as $user){ $orders = $user->orders(); }

投稿2018/04/23 04:00

kawax

総合スコア10377

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

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

yuuuui

2018/04/23 05:52

ありがとうございます。リレーションは行なっていたので、 上記で取ってこれることを確認取れました。 ベストアンサーとさせていただきます。
guest

0

実際に確認したわけではなく申し訳ないのですが...
Eloquentを利用して、以下のような感じでいけないでしょうか。

php

1$orders = Order::whereHas('user', function ($query) use ($userId) { 2 $query->where('id', $userId); 3})->get();

ご参考: 存在するリレーションのクエリ

投稿2018/04/23 04:04

Lulucom

総合スコア1899

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

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

yuuuui

2018/04/23 05:54

ご回答いただきありがとうございます。 whereHasというのもあるのですね、勉強になりました。 今回はwhereHasでは期待する動作をしなかったのですが、別の場所で使用できそうでしたので 活用させていただきます。 ありがとうございました。
Lulucom

2018/04/23 06:36 編集

要件を勘違いしていたようです、失礼しました。
yuuuui

2018/04/23 06:55

いえ、私の説明不足でしたのでこちらこそすみませんでした。 ありがとうございました。
guest

0

これは結局「同じuser_idは1レコードとみなす」ようにしたいということでしょうか?groupBy()とかでできそうに思います。

php

1$orders = DB::table('orders')->groupBy('user_id')->get();

投稿2018/04/23 03:58

m.ts10806

総合スコア80850

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

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

yuuuui

2018/04/23 05:52

私の説明不足ですみません。groupBy()では期待する動作をしませんでした。 でも今まで使ったことがなかったので、勉強になりました。 ありがとうございました。
m.ts10806

2018/04/23 06:11 編集

なるほど了解です。 質問する際はコードより要件部分を充実させた方がいいかもしれませんね。 冒頭にあるのはあくまで「自分がやってみた手順」なので、「本来の大目的部分、前提」辺りがきっちりあれば適切な回答がつきやすくなります。
yuuuui

2018/04/23 06:55

そうですね、おっしゃる通りです。 きちんと前提も含めて質問しようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問