🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Laravel

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

895閲覧

【Laravel】 1対多のデータ取得方法について教えてください!

kami_tsukai

総合スコア26

Laravel

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2019/11/23 16:00

編集2019/11/24 02:47

現状

現在、Laravel + Vueでしおり作成サービスのようなものを作成しています。
HTTP通信にはaxiosを使用しています。

フォームの数が動的に変わるこのサイトのしおり作成画面がイメージしてます。
参考URL
※ 日時は現状入れておりません。

現状、悩んでいるのは**「しおり作成機能」**です。
特に以下の3つです。

  • モデル設計はこれでいいのか?
  • テーブルが複数になった場合は、しおり作成時、一括で全部のデータを送る方法はアリなのか?
  • 1対多のデータ取得方法がわからない

モデル設計はこれでいいのか?

以下がモデル設計です。

guide - id (PK) - guide_title guide_overview - id (PK) - guide_id ( FK <guide> ) - overview_title - overview_content guide_place - id (PK) - guide_id ( FK <guide> ) - place - place_detail

過去、一つ(Guide)にまとめていて、場所などは配列から文字列にシリアライズしていたのですが、少し怖かったのでこの形式にしたという流れです。

テーブルが複数になった場合は、しおり作成時、一括で全部のデータを送る方法はアリなのか?

以下が作成時にサーバー側に渡されるパラメータです。

疑問点
3つモデルがある中で、一つのコントローラーに集約して処理を書くと汚くなりそう。

form: { title: '', days: '', overviewForm: [ { overview: '', content: '' } ], placeForm: [ { place: '', detail: '' } ] },

1対多のデータ取得方法がわからない

現状でてるエラー

Exception: Property [id] does not exist on this collection instance

controller

return new GuideResource(MainBookmark::all());

resource(guide)

public function toArray($request) { return [ 'id' => $this->id, 'guide_title' => $this->guide_title, 'overviewForm' => [ BookmarkOverviewResource::collection($this->overviewForm) ], 'placeForm' => [ BookmarkPlaceResource::collection($this->placeForm) ], ]; }

resource(guide_place)

public function toArray($request) { return[ 'place' => $this->place, 'detail' => $this->place_detail ]; }

resource(guide_overview)

public function toArray($request) { return [ 'overview' => $this->overview_title, 'content' => $this->overview_content ]; }

かなり長くなってしまいましたが3つあるうちの1つでもいいのでご回答いただけると幸いです!

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

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

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

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

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

kami_tsukai

2019/11/24 02:48

今修正いたしました。 ご指摘ありがとうございます。
guest

回答1

0

ベストアンサー

モデル設計はこれでいいのか?

過去、一つ(Guide)にまとめていて

まとまった状態で問題無ければまとまったまま使っても問題ありません
バラした方が良いという事なら、まずは正規化を調べて分離し直してみてください
それから一度まとまった状態に戻して、調べた情報を元に再度バラして使いやすい状態に持っていけたらそれがあなたにとっての正解です

テーブルが複数になった場合は、しおり作成時、一括で全部のデータを送る方法はアリなのか?

あり
ユーザーに優しい操作フローにした結果その方法が適切だと思うならそれが正解です

1対多のデータ取得方法がわからない

最適な書き方が分からないという場合

joinして一発で取っても、1テーブルずつIDを条件にして3回SQLを投げてもどちらでも構いません
phpとmysqlならmysqlの方が計算処理が高速ですが、それを気にしなきゃいけない程のデータ量及びアクセス量でないのなら自分が理解しやすい方法で作ればいいです

Laravelでの書き方が分からないという場合

マニュアルを見るのが良いと思いますが、調べようにも言葉が分からないという事なら、joinとか結合とか複数とかテーブルという単語と併せてマニュアル検索してみてください

投稿2019/11/24 03:02

hentaiman

総合スコア6426

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

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

kami_tsukai

2019/11/24 06:29

詳しく教えてくださってありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問