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

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

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

Frameworkは、アプリケーションソフトを開発する際に、一般的な機能をより簡単に、より早く完了させる事を目的とした、ソフトウェアやライブラリのセットを指します。開発にフレームワークを使用する事で、追加で必要となる機能だけを開発するだけで済む為、開発効率の向上が見込めます。

Laravel

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

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Eloquent

Eloquentとは、PHPフレームワークのLaravelに最初から含まれているORM(Object-relational mapping:オブジェクト関係マッピング)です。

Q&A

解決済

モデルにおけるデータ記録処理の連携について

mcddx330
mcddx330

総合スコア14

Framework

Frameworkは、アプリケーションソフトを開発する際に、一般的な機能をより簡単に、より早く完了させる事を目的とした、ソフトウェアやライブラリのセットを指します。開発にフレームワークを使用する事で、追加で必要となる機能だけを開発するだけで済む為、開発効率の向上が見込めます。

Laravel

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

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Eloquent

Eloquentとは、PHPフレームワークのLaravelに最初から含まれているORM(Object-relational mapping:オブジェクト関係マッピング)です。

1回答

0グッド

0クリップ

392閲覧

投稿2020/01/20 05:31

編集2020/01/20 05:33

現在構築しているwebサービスのシステムにおいて、複数テーブルをまたいだデータの保存方法に悩んでいます。

例題

あるユーザーAさんが商品Iを購入したというデータを新規で記録する場合

  • ユーザーデータが存在する

「userテーブル.ユーザーA」

  • そのユーザーが商品を買う

「receiptテーブル.商品IのID」

  • 購入した商品に好きなタグがつけられる

「tagテーブル.タグ名X」、「tagテーブル.タグ名Y」・・・

といったイメージです。

ここで実際に記録する際、Laravel(Eloquent)上では次のような記述になるかと思われますが、

php

1/* コントローラー上の動作 */ 2 3// アイテム情報取得 4$item_model = Item::find('アイテムのID'); 5 6// ユーザー情報取得 7$user_model = User::find('ユーザーID'); 8 9// 購入情報記録 10$reciept_model = Receipt::create([ 11 'user_id' => $user_model->id, 12 'item_id' => $item_model->id, 13]); 14 15// アイテムに対するタグ付け 16$tag_model = Tag::create([ 17 'user_id' => $user_model->id, 18 'item_id' => $item_model->id, 19 'tag_value' => 'タグ名' 20]);

この場合登録ごとにcreateをするのでどこか冗長的な気がします。
そこで「ユーザーは商品を買わないと好きなタグが付けられない」という事から、次のような方法を検討しています。

php

1/* Receiptモデル上 */ 2protected $tag_value; 3 4public function saveWithTag() { 5 self::create([ 6 'user_id' => $this->user_id, 7 'item_id' => $this->item_id, 8 ]); 9 Tag::create([ 10 'user_id' => $this->user_id, 11 'item_id' => $this->item_id, 12 'tag_value' => $this->tag_value, 13 ]); 14} 15 16 17/* コントローラー上 */ 18// アイテム情報取得 19$item_model = Item::find('アイテムのID'); 20 21// ユーザー情報取得 22$user_model = User::find('ユーザーID'); 23 24// 購入記録とタグ付けを同時に行う(※変更点※) 25$receipt_model = new Receipt(); 26$receipt_model->user_id = $user_model->id; 27$receipt_model->item_id = $item_model->id; 28$receipt_model->tag_value = 'タグ名'; 29 30$reciept_model->saveWithTag();

ここでお伺いしたいのが、上記の通り

  • 「ユーザーは商品を買わないと好きなタグが付けられない」

という点から

  • 「購入履歴モデルにはタグ付けをする責務も負わせることが出来る」

という解釈で、今回のようにその他テーブルへの(読み)書きを行うという考えは普通なのでしょうか?

もしくは

  • 「1つのモデルは1つのテーブルしか取り扱ってはいけない」

という考えの元、関係性があったとしても連携はあくまでコントローラー上など「別の適切な場所」で行うのが普通なのでしょうか?

宜しくお願いいたします。

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

mikkame

2020/01/20 05:59

複数回に渡る同一商品の購入は想定されていますか?
mcddx330

2020/01/20 20:02

はい。同一商品の購入を行った場合も新規で登録が行える(=追加登録可能)事も想定しています。 「買う度に増える一方では?」という点についてはタグ付を行わないケースや別途編集・削除機能が存在するという見立てで問題ありません。 あくまで複数テーブルを使用する際の記述作法についての内容です。

回答1

0

ベストアンサー

この場合登録ごとにcreateをするのでどこか冗長的な気がします。

リレーションに対するsave/createを行う事でもう少しスマートにかけるかと思います。
関連したモデルの挿入/更新

そこで「ユーザーは商品を買わないと好きなタグが付けられない」という事から、次のような方法を検討しています

注文ごとにタグをつける事ができるなら、Receiptに直接タグ名を突っ込めば良いかと思います

投稿2020/01/21 06:47

mikkame

総合スコア5034

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

mcddx330

2020/01/24 04:06

> リレーションに対するsave/createを行う事でもう少しスマートにかけるかと思います。 なるほどリレーションの手がありましたね。元データから連携して読みに行く印象が強かったので盲点でした。 > 注文ごとにタグをつける事ができるなら、Receiptに直接タグ名を突っ込めば良いかと思います こちらも考えたのですが、独立して管理するほうが都合がいいケースもあり(例自体が良いものではなかったかもしれません・・・)、あえて分けて考えるようにしていました。 ただ上記点でも十分コードの質的に間違いが起きにくそうなので、こちらをベストアンサーにします。ありがとうございます!

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Framework

Frameworkは、アプリケーションソフトを開発する際に、一般的な機能をより簡単に、より早く完了させる事を目的とした、ソフトウェアやライブラリのセットを指します。開発にフレームワークを使用する事で、追加で必要となる機能だけを開発するだけで済む為、開発効率の向上が見込めます。

Laravel

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

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Eloquent

Eloquentとは、PHPフレームワークのLaravelに最初から含まれているORM(Object-relational mapping:オブジェクト関係マッピング)です。