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

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

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

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Laravel

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

Laravel 5

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

1回答

1147閲覧

Laravel5.5のAPI Resourceにおけるキーについて

arw.tyx-out_mz

総合スコア27

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Laravel

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

Laravel 5

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

1クリップ

投稿2018/04/01 10:33

前提

現在Laravel5.5を用いたAPIを作成しています.
JSONレスポンスの定義中にわからないことがあったので質問させていただきます.

実現したいこと

テーブルのデータを'year'カラムでまとめた後に'month'カラムでまとめてレスポンスに投げたいです.

以下のようなテーブルデータがあった時に

sql

1+------+-------+---------------------------------------------------------------------------------------------------------+ 2| year | month | people | 3+------+-------+---------------------------------------------------------------------------------------------------------+ 4 5| 2017 | 3 | 松本 知実 | 6| 2016 | 12 | 中島 春香,中津川 充,村山 裕樹,杉山 翼,中島 春香,木村 稔 | 7| 2017 | 3 | 桐山 裕太,吉本 稔,藤本 稔 | 8| 2015 | 3 | 喜嶋 学,若松 康弘,鈴木 直子,宮沢 幹 | 9| 2017 | 11 | 大垣 晃,江古田 里佳,野村 康弘,中村 美加子,喜嶋 裕太 | 10| 2016 | 6 | 中島 春香,中津川 充,村山 裕樹,杉山 翼,中島 春香,木村 稔 | 11| 2015 | 11 | 野村 英樹,工藤 智也,山本 七夏,青田 舞 |

次のようなJSONを返したいです.

json

1 2"2015" : { 3 "3" : { 4 "people" : "喜嶋 学,若松 康弘,鈴木 直子,宮沢 幹" 5 }, 6 "11" : { 7 "people" : "野村 英樹,工藤 智也,山本 七夏,青田 舞" 8 }, 9}, 10"2016" : { 11 "6" : { 12 "people" : "中島 春香,中津川 充,村山 裕樹,杉山 翼,中島 春香,木村 稔" 13 }, 14 "12" : { 15 "people" : "中島 春香,中津川 充,村山 裕樹,杉山 翼,中島 春香,木村 稔" 16 }, 17}, 18"2017" : { 19 "3" : { 20 [ 21 "people" : "松本 知実", 22 "people" : "桐山 裕太,吉本 稔,藤本 稔", 23 ] 24 }, 25 "11" : { 26 "people" : "大垣 晃,江古田 里佳,野村 康弘,中村 美加子,喜嶋 裕太" 27 }, 28}

簡易化しているので2017年の3月にpeopleキーが2つあるのは気にしないでください.

該当のソースコード

ソースコードは以下のようになっています.

php

1class PublicationResource extends Resource 2{ 3 /** 4 * Transform the resource into an array. 5 * 6 * @param \Illuminate\Http\Request $request 7 * @return array 8 */ 9 public function toArray($request) 10 { 11 return [ 12 $this->year => [ 13 $this->month => [ 14 'people' => $this->people, 15 'title' => $this->title, 16 'journal' => $this->journal, 17 'volume' => $this->volume, 18 'number' => $this->number, 19 'category' => $this->type->category, 20 ], 21 ], 22 ]; 23 } 24}

php

1class PublicationController extends Controller 2{ 3 public function index() 4 { 5 $publications = Publication::with('type') 6 ->orderBy('year', 'DESC') 7 ->orderBy('month', 'DESC') 8 ->get(); 9 return PublicationResource::collection($publications); 10 } 11}

現状のJSONレスポンス

上記のソースコードで実行すると,レスポンスは

JSON

1 2"2017": { 3 "11": { 4 "people": "大垣 晃,江古田 里佳,野村 康弘,中村 美加子,喜嶋 裕太" 5 } 6}, 7"2017": { 8 "3": { 9 "people": "松本 知実" 10 } 11}, 12"2017": { 13 "3": { 14 "people": "桐山 裕太,吉本 稔,藤本 稔" 15 } 16}, 17"2016": { 18 "12": { 19 "people": "中島 春香,中津川 充,村山 裕樹,杉山 翼,中島 春香,木村 稔" 20 } 21}, 22"2016": { 23 "6": { 24 "people": "中島 春香,中津川 充,村山 裕樹,杉山 翼,中島 春香,木村 稔" 25 } 26}, 27"2015": { 28 "11": { 29 "people": "野村 英樹,工藤 智也,山本 七夏,青田 舞" 30 } 31}, 32"2015": { 33 "3": { 34 "people": "喜嶋 学,若松 康弘,鈴木 直子,宮沢 幹" 35 } 36},

このようになり,yearカラムとmonthカラムが共通している部分をまとめてくれません.
どのように修正すればいいでしょうか?

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

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

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

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

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

guest

回答1

0

PublicationResource::collectionとすると、AnonymousResourceCollectionを使うことになるので、
継承元のIlluminate\Http\Resources\Json\ResourceCollectionの以下のコードあたりで一つ一つmap処理しているところに原因がありそうな気がします。

public function toArray($request) { return $this->collection->map->toArray($request)->all(); }

多段的な階層なのものは自身でコレクション用のtoArrayを作成するほうが良いかもしれないですね。

Laravel 5.5 Eloquent: APIリソース

コレクションリソースを生成すれば、レスポンスに含めたいメタデータを簡単に定義できます。
return new UserCollection(User::all());

投稿2018/04/01 13:49

aro10

総合スコア4106

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問