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

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

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

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

PHP

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

データベース

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

Q&A

解決済

2回答

1854閲覧

モデルの肥大化の対策について

chibi144

総合スコア64

Laravel

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

PHP

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

データベース

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

1グッド

2クリップ

投稿2018/04/13 09:02

前提・実現したいこと

Laravelを使って、特定品番の部品を一覧で表示するアプリケーションを作っています。
view側のロジックを減らそうと思ってModelの中で整形していたのですが、
DBのテーブル名、項目名にも、構造にもがっつり依存したものが出来上がってしまいました。
機能を切り出そうにも、どこから手をつけていいものかわかりません。
アドバイス頂けないでしょうか。

更に追加したい機能

  • itemsテーブルに品番が存在しなかったときのリダイレクト
  • 画像ファイルの存在チェック
  • 部品としては登録されているけど画像が登録されていない/所定の場所にないときにnoimage.jpgに変換

該当のソースコード

itemsテーブル//製品品番が入っているテーブル

id(品番)name(品名)planID(図面ID)
IPX-SGアイフォンエックス//スペースグレーIP10
IPX-Sアイフォンエックス//シルバーIP10
IP8-Rアイフォンエイト//レッドIP8

items_partsテーブル//製品ごとの部品の品番が入っているテーブル

idA(A項目の部品)BC
IPX-SGIP-101IP-201【2009年5月より前の製造分】,IP-202【2009年5月以降の製造分】
IPX-SIP-102IP-201【2009年5月より前の製造分】,IP-202【2009年5月以降の製造分】
IP8-RIP-105IP-201IP-301

plans_columnsテーブル//図面ごとの項目名が入っているテーブル

planIDA(項目名)BC
IP10カバー液晶
IP8カバー液晶イヤホンジャック

parts_specificationテーブル//部品品番ごとの明細や画像ファイル名が入っているテーブル

part_idpart_specificationspart_imageFile
IP-101カバー1枚、カメラ、スピーカーIP-101.jpg
IP-105カバー1枚、カメラIP-105.jpg
IP-201液晶IP-201.jpg
IP-202液晶(有機EL)IP-202.jpg
IP-301イヤホンジャックnoimage.jpg

php

1public function tableSwitch($newTable, $primaryKey = 'id', $keyType = 'string'){ 2 $this->table = $newTable; 3 $this->setKeyName($primaryKey); 4 $this->setKeyType($keyType); //実質意味なし 5 $this->incrementing = false; //実質意味なし 6 } 7 8public function getOverallItemInfomation($get) 9 { 10 $this->tableSwitch('items','id'); 11 $item = $this 12 ->select('id', 'name', 'planID') 13 ->where('id', $get)->first()->toArray(); 14 15 // 部品情報 16 $this->tableSwitch('items_parts','id'); 17 $parts = $this->where('id', $get)->first()->toArray(); 18 19 // 項目名 20 $this->tableSwitch('plans_columns','planID'); 21 $plan_columns = $this->where('planID', $item['planID'])->first()->toArray(); 22 23 // 部品分割 24 foreach ( $parts as $key => $part ){ 25 $tmp = preg_replace("/[(|【].+?[)|】]/u", "", $part); //品番に【】が含まれていたらそれを取り除く 26 $degradedPartsWithComment[$key] = explode(',', $tmp); 27 } 28 foreach ( $parts as $key => $part ){ 29 $degradedPartsNOComment[$key] = explode(',', $part); 30 } 31 32 $this->tableSwitch('parts_specification','part_id'); 33 foreach ( $degradedPartsWithComment as $key => $column ){ 34 foreach ($column as $part ) { 35 $tmp = $this->select('part_specifications', 'part_imageFile')->where('part_id', $part)->first(); 36 if ( !empty($tmp) ){ 37 $specifications[$key][] = $tmp->toArray(); 38 } else { 39 $specifications[$key] = null; 40 } 41 } 42 } 43 44 unset($parts['id']); 45 unset($parts['note']); 46 47 foreach ( $specifications as $key => $val ) { 48 if ( !is_array($val) ) $val = array(); 49 $spec[$key] = array_pluck($val, "part_specifications"); 50 $imageFile[$key] = array_pluck($val, "part_imageFile"); 51 } 52 53 foreach ( $parts as $key => $part ){ 54 if ( !empty($part) ){ 55 $test[$key]['column'] = $plan_columns[$key]; 56 $test[$key]['part'] = $degradedPartsNOComment[$key]; 57 $test[$key]['spec'] = $spec[$key]; 58 $test[$key]['imageFile'] = $imageFile[$key]; 59 } 60 } 61 62 $item['specs'] = $test; 63 64 return $test; 65 }

html

1// print_r($item)の結果であり、最終目標である形 2Array 3( 4 [id] => IPX-SG 5 [name] => アイフォンエックス//スペースグレー 6 [planID] => IP10 7 [specs] => Array 8 ( 9 [A] => Array 10 ( 11 [column] => カバー 12 [part] => Array 13 ( 14 [0] => IP-101 15 ) 16 17 [spec] => Array 18 ( 19 [0] => カバー1枚、カメラ、スピーカー 20 ) 21 22 [imageFile] => Array 23 ( 24 [0] => IP-101.jpg 25 ) 26 27 ) 28 29 [B] => Array 30 ( 31 [column] => 液晶 32 [part] => Array 33 ( 34 [0] => IP-201【2009年5月より前の製造分】 35 [1] => IP-202【2009年5月以降の製造分】 36 ) 37 38 [spec] => Array 39 ( 40 [0] => 液晶 41 [1] => 液晶(有機EL) 42 ) 43 44 [imageFile] => Array 45 ( 46 [0] => IP-201.jpg 47 [1] => IP-202.jpg 48 ) 49 50 ) 51} 52 53<section class="plan__list"> 54 {% for %} //部品の数だけ繰り返す 55 <div class="plan__list__part"> 56 <h3 class="plan__list__title">{{ 項目名 }}</h3> 57 <div class="plan__list__content"> 58 {# 左側 #} 59 <div class="plan__list__content--left"> 60 {% for %} 61 <img src="{{ 部品の画像 }}"> 62 {% endfor %} 63 </div> 64 {# 右側 #} 65 <div class="plan__list__content--right"> 66 {# 品番 #} 67 <div class="plan__list__content--right__column"> 68 <div>品番</div> 69 <div> 70 {% for %} 71 {{ 部品の品番 }} 72 {% endfor %} 73 </div> 74 </div> 75 <hr class="plan__list__content__hr"> 76 {# 明細 #} 77 <div class="plan__list__content--right__column"> 78 <div>明細</div> 79 <div> 80 {% for %} 81 {{ 部品の明細 }} 82 {% endfor %} 83 </div> 84 </div> 85 </div> 86 </div> 87 </div> 88 {% endfor %} 89</section> 90

補足情報(FW/ツールのバージョンなど)

PHP 7.2.3
Laravel 5.6.3(現在移行作業中)

m.ts10806👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

そもそもtableSwitchなんてやってるのがあまりにも意味不明すぎて…。
テーブルごとにEloquentモデルを作るんですよ。
ItemとかItemPartとか。

getOverallItemInfomationに書いてるようなことは開発初期はコントローラーに書けばいい。
難しいことを気にする以前の段階。

投稿2018/04/13 10:19

kawax

総合スコア10377

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

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

0

だいたいの場合にSQLで解決できることはSQLでやるとコードはシンプルにパフォーマンスも良くなります。SQL素人でも分かるテーブル結合(inner joinとouter join)

投稿2018/04/13 22:10

Orlofsky

総合スコア16415

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問