現在構築している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つのテーブルしか取り扱ってはいけない」
という考えの元、関係性があったとしても連携はあくまでコントローラー上など「別の適切な場所」で行うのが普通なのでしょうか?
宜しくお願いいたします。
回答1件
あなたの回答
tips
プレビュー