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

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

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

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Q&A

解決済

1回答

440閲覧

foreachで二つのテーブルから一つのテーブルを作りたい。

sugawa

総合スコア24

foreach

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

0グッド

0クリップ

投稿2020/02/19 23:04

こんにちは!
イメージ説明

只今、簡単なシフト機能を作っています。
いつ、誰が、どのシフトに入るかのshiftテーブルをつくる必要があります。

人数が増えたとき
二重のforeachが必要だと思っています。

・1人が全部のシフトに這入る場合の手書き

//ユーザー一人が全部のシフトに入る $dates = Date::all(); $user = User::first(); $user_id = $user->id; $date_array = []; foreach($dates as $date){ $shift = new Shift; $shift->date_id = $date->id; $shift->user_id = $user_id; $shift->save(); }

//ユーザー二人が全部のシフトに入る

$dates = Date::all(); foreach($dates as $date){ $shift = new Shift; $user = User::find(1); $shift->date_id = $date->id; $shift->user_id = $user->id; $shift->save(); $shift = new Shift; $user = User::find(2); $shift->date_id = $date->id; $shift->user_id = $user->id; $shift->save(); }

のような形で書けます。

この場合人数が増えるとコードがいっぱいになるのでforeachで書きたいと思っています。
foreachの二重に挑戦してみました

$dates = Date::all(); $users = User::all(); foreach($dates as $date){ $shift = new Shift; $shift->date_id = $date->id; foreach($users as $user) { $user_id = $user->id; $user = User::find($user_id); $shift->user_id = $user->id; } $shift->save(); }

イメージ説明

user_idに2しか入ってこず、しっかりforeachが回っていないみたいです。
何日間も悩んでいますが解決しなくて質問しました!
よろしくお願いいたします。

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

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

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

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

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

m.ts10806

2020/02/19 23:43

foreachではなくjoinで一発でとれるのでは?SQLは組んでみましたか?
sugawa

2020/02/19 23:46

SQLは組んでいません。 コントローラー側の処理の一部なので コントローラー内で処理したいです
m.ts10806

2020/02/19 23:56

いえ、どうみてもモデル側で済む処理ではないでしょうか。DB側から取得時に出力したい形でデータ取得すればロジックもスッキリしてパフォーマンスにも良い影響があります。 どうしてもというのでしたらご自由に、ですけど。
sugawa

2020/02/19 23:59

すみません知識不足でした。 モデル側の処理なんですね。 モデルでSQL書くのですかね?
m.ts10806

2020/02/20 00:55

そもそもjoinで通じてますか? それ次第かと。 結局のところshiftテーブルにある各idから名称なり明細を取得したいという風に見えるのですが。
sugawa

2020/02/20 01:07

joinはさっきまで知らなかったので調べないといけない状況です。 やりたい事はそれです!
guest

回答1

0

ベストアンサー

まず「とりたい結果が得られるSQL」を作りましょう。
余程の事情がない限り、画面に表示したい形でデータがとれればアプリケーションサイドで色々こねくり回す必要がなくなるのでそれが最も良いはずです。

今回だとたぶんこう(未検証)

SQL

1SELECT 2 s.id as shift_id 3 ,s.user_id 4 ,u.name as user_name 5 ,s.date_id 6 ,d.year 7 ,d.mdw 8FROM 9 shifts s 10INNER JOIN 11 users u 12 ON u.id=s.user_id 13INNER JOIN 14 dates d 15 ON d.id=s.date_id

まずはこんな感じのSQLをアプリケーションからではなくDBに対して直に実行して、想定の結果を得られるか確認してください。

確認できたらアプリケーション側に組み込みます。

これで主となるテーブル、副となるテーブルが決まるので、あとはフレームワークの仕様にそって作っていく形ですね。

Laravelのバージョン提示されてないので、ドキュメントは自身で確認していただくとして、クエリビルダの項にjoinについての機能説明がありますし、モデルでつなぐならリレーションの項を確認されると良いと思います。

投稿2020/02/20 01:21

m.ts10806

総合スコア80875

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

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

sugawa

2020/02/20 01:36

試してみますね! ありがとうございます????
m.ts10806

2020/02/20 02:03

できれば、試してゴールが見えてから解決済みにしてもらえると。 第三者目線で見ると「結局どうなったの?」ってなりません?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問