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

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

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

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

5回答

1520閲覧

foreachで回すと多次元配列になってしまう

tomato513

総合スコア12

Laravel

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/05/27 10:47

編集2019/05/27 11:10

ご覧いただきありがとうございます!
PHP初心者のため、「何言ってんだこいつ」と思われるかもしれませんが、ご容赦ください。

PHP

1//TestController 2 public function friends(Request $request) 3 { 4 5  //foreachでfriend_idをidにもつuserを取得してこの配列に入れたい 6 $friends = []; 7 8 //hasManyでfriend_idを配列で取得 9 /*[ 10 { 11 "friend_id": 1 12 }, 13 { 14 "friend_id": 4 15 }, 16 { 17 "friend_id": 2 18 } 19 ]*/ 20 $friend_ids = $this->user::find($request['id'])->friends; 21 22 foreach ($friend_ids as $key => $value) { 23 $friends[] = $this->user::find($value); 24 } 25 26 $data = [ 27 'friends' => $friends, 28 ]; 29 30 return response()->json($data); 31 }

json

1//このレスポンスが返ってきてしまう 2"friends": [ 3 [ 4 { 5 "id": 1, 6 "email": "kishimoto@gmail.co.jp", 7 "password": "kishimoto", 8 "name": "岸本", 9 "tenant_id": 2, 10 "friend_code": 543673, 11 "role": 0, 12 "valid": 0, 13 "comment": null, 14 "created_at": "-0001-11-30 00:00:00", 15 "updated_at": "-0001-11-30 00:00:00" 16 } 17 ], 18 [ 19 { 20 "id": 4, 21 "email": "hashimoto@gmail.co.jp", 22 "password": "hashimoto", 23 "name": "橋下", 24 "tenant_id": 2, 25 "friend_code": 284763, 26 "role": 0, 27 "valid": 0, 28 "comment": null, 29 "created_at": "-0001-11-30 00:00:00", 30 "updated_at": "-0001-11-30 00:00:00" 31 } 32 ], 33 [ 34 { 35 "id": 2, 36 "email": "tanaka@gmail.co.jp", 37 "password": "tanaka", 38 "name": "田中", 39 "tenant_id": 4, 40 "friend_code": 857034, 41 "role": 0, 42 "valid": 0, 43 "comment": null, 44 "created_at": "-0001-11-30 00:00:00", 45 "updated_at": "-0001-11-30 00:00:00" 46 } 47 ] 48 ]

JSON

1//本当はこうしたい 2{ 3 "friends": [ 4 { 5 "id": 2, 6 "email": "tanaka@gmail.co.jp", 7 "password": "tanaka", 8 "name": "田中", 9 "tenant_id": 4, 10 "friend_code": 857034, 11 "role": 0, 12 "valid": 0, 13 "comment": null, 14 "created_at": "-0001-11-30 00:00:00", 15 "updated_at": "-0001-11-30 00:00:00" 16 }, 17 { 18 "id": 4, 19 "email": "hashimoto@gmail.co.jp", 20 "password": "hashimoto", 21 "name": "橋下", 22 "tenant_id": 2, 23 "friend_code": 284763, 24 "role": 0, 25 "valid": 0, 26 "comment": null, 27 "created_at": "-0001-11-30 00:00:00", 28 "updated_at": "-0001-11-30 00:00:00" 29 }, 30 { 31 "id": 1, 32 "email": "kishimoto@gmail.co.jp", 33 "password": "kishimoto", 34 "name": "岸本", 35 "tenant_id": 2, 36 "friend_code": 543673, 37 "role": 0, 38 "valid": 0, 39 "comment": null, 40 "created_at": "-0001-11-30 00:00:00", 41 "updated_at": "-0001-11-30 00:00:00" 42 } 43 ] 44}

返したいJSONが[]に入ってしまい、アプリ側で取り出しづらいです。
返したいレスポンスは
$friends[0] = $this->user::find($friend_ids[0]['friend_id']);
$friends[1] = $this->user::find($friend_ids[1]['friend_id']);
で作れるのですが、foreachで回すと[]の中に入ってしまいます。
{}と[]の違いもいまいち理解できてないのですが、
foreachと$friends[0]とやっている処理は同じではないのでしょうか?

PHP

1//Userクラスになります 2class User extends Model 3{ 4 5 public function friends() 6 { 7 8 $friend_ids = $this -> hasMany('App\Friend')->select(['friend_id']); 9 return $friend_ids; 10 11 } 12}

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

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

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

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

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

miyabi_takatsuk

2019/05/27 11:00

おそらく、クラスメソッドだとお見受けしますが、できれば、user::findメソッドの内容も記載いただいたほうが、解決につながりやすいかと思います。 もしかしたら、返している値に原因がある可能性もあるかと・・・。
tomato513

2019/05/27 11:10

修正いたしました! ご検討・ご指摘いただきありがとうございます!
guest

回答5

0

ベストアンサー

first()が使えそうに思います。

投稿2019/05/27 11:16

m.ts10806

総合スコア80850

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

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

tomato513

2019/05/27 11:56

ご回答頂きありがとうございます! first()はスマートに見えると思います! 私のようなケースは結構あるのでしょうか?
m.ts10806

2019/05/27 12:20

正直なところ、「要件通りできていれば良い」ので競技プログラミングとかするのでなければ「自身が実現可能なやり方」で良いと思います。 一応、フレームワークであればフレームワークが提供している機能を確認して使うのが効率的で確実とは思いますけど。
guest

0

php

1class User extends Model 2{ 3 public function friends() 4 { 5 return $this->hasMany(App\Friend::class); 6 } 7}
class TestController entends Controller { public function friends(Request $request) { return \collent('friends' => User::find($request['id'])->friends)->toJson(); } }

これでいいと思います。

投稿2019/05/27 12:13

編集2019/05/27 12:21
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

よくわかりませんが単純に考えればこう?

PHP

1 $friends[] = $this->user::find($value)[0];

投稿2019/05/27 10:51

yambejp

総合スコア114775

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

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

tomato513

2019/05/27 11:12

ご回答ありがとうございます! 確かにインデックスで解決はするのですが、スマートじゃないかなと思いまして。。。 結構yambejs様がご回答いただいた記述方法は現場などで使用されるのでしょうか?
guest

0

デバッグのために、ORMがデータベースに対してどのようなSQLを発行してデータを取得しているかのログを取るために、以下のようなデータベースクエリログのライブラリを使うと問題解決の糸口に繋がります。
mnabialek/laravel-sql-logger

投稿2019/05/27 13:49

aro10

総合スコア4106

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

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

0

JSONを「こういう形式で欲しい」時のAPIリソース。
https://readouble.com/laravel/5.8/ja/eloquent-resources.html

その前にまずEloquentの基本を身に付けるのが先。Eloquentの使い方から間違ってる。
よく見るけど簡単にできる便利な機能があるのに無視して素のPHPでなんとかしようと無駄なことしてる例が多い。

投稿2019/05/27 13:43

kawax

総合スコア10377

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問