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

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

ただいまの
回答率

90.34%

  • PHP

    21407questions

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

  • データベース

    737questions

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

  • Laravel

    715questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 2
  • VIEW 210

ark0214

score 51

 前提・実現したいこと

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

 更に追加したい機能

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

 該当のソースコード

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

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

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

id A(A項目の部品) B C
IPX-SG IP-101 IP-201【2009年5月より前の製造分】,IP-202【2009年5月以降の製造分】
IPX-S IP-102 IP-201【2009年5月より前の製造分】,IP-202【2009年5月以降の製造分】
IP8-R IP-105 IP-201 IP-301

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

planID A(項目名) B C
IP10 カバー 液晶
IP8 カバー 液晶 イヤホンジャック

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

part_id part_specifications part_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
public function tableSwitch($newTable, $primaryKey = 'id', $keyType = 'string'){
        $this->table = $newTable;
        $this->setKeyName($primaryKey);
        $this->setKeyType($keyType); //実質意味なし
        $this->incrementing = false; //実質意味なし
    }

public function getOverallItemInfomation($get)
    {
        $this->tableSwitch('items','id');
        $item = $this
            ->select('id', 'name', 'planID')
            ->where('id', $get)->first()->toArray();

        // 部品情報
        $this->tableSwitch('items_parts','id');
        $parts = $this->where('id', $get)->first()->toArray();

        // 項目名
        $this->tableSwitch('plans_columns','planID');
        $plan_columns = $this->where('planID', $item['planID'])->first()->toArray();

        // 部品分割
        foreach ( $parts as $key => $part ){
            $tmp = preg_replace("/[(|【].+?[)|】]/u", "", $part); //品番に【】が含まれていたらそれを取り除く
            $degradedPartsWithComment[$key] = explode(',', $tmp);
        }
        foreach ( $parts as $key => $part ){
            $degradedPartsNOComment[$key] = explode(',', $part);
        }

        $this->tableSwitch('parts_specification','part_id');
        foreach ( $degradedPartsWithComment as $key => $column ){
            foreach ($column as $part ) {
                $tmp = $this->select('part_specifications', 'part_imageFile')->where('part_id', $part)->first();
                if ( !empty($tmp) ){
                    $specifications[$key][] = $tmp->toArray();
                } else {
                    $specifications[$key] = null;
                }
            }
        }

        unset($parts['id']);
        unset($parts['note']);

        foreach ( $specifications as $key => $val ) {
            if ( !is_array($val) ) $val = array();
            $spec[$key] = array_pluck($val, "part_specifications");
            $imageFile[$key] = array_pluck($val, "part_imageFile");
        }

        foreach ( $parts as $key => $part ){
            if ( !empty($part) ){
                $test[$key]['column'] = $plan_columns[$key];
                $test[$key]['part'] = $degradedPartsNOComment[$key];
                $test[$key]['spec'] = $spec[$key];
                $test[$key]['imageFile'] = $imageFile[$key];
            }
        }

        $item['specs'] = $test;

        return $test;
    }
// print_r($item)の結果であり、最終目標である形
Array
(
    [id] => IPX-SG
    [name] => アイフォンエックス//スペースグレー
    [planID] => IP10
    [specs] => Array
        (
            [A] => Array
                (
                    [column] => カバー
                    [part] => Array
                        (
                            [0] => IP-101
                        )

                    [spec] => Array
                        (
                            [0] => カバー1枚、カメラ、スピーカー
                        )

                    [imageFile] => Array
                        (
                            [0] => IP-101.jpg
                        )

                )

            [B] => Array
                (
                    [column] => 液晶
                    [part] => Array
                        (
                            [0] => IP-201【2009年5月より前の製造分】
                            [1] => IP-202【2009年5月以降の製造分】
                        )

                    [spec] => Array
                        (
                            [0] => 液晶
                            [1] => 液晶(有機EL)
                        )

                    [imageFile] => Array
                        (
                            [0] => IP-201.jpg
                            [1] => IP-202.jpg
                        )

                )
}

<section class="plan__list">
  {% for %} //部品の数だけ繰り返す
  <div class="plan__list__part">
    <h3 class="plan__list__title">{{ 項目名 }}</h3>
    <div class="plan__list__content">
      {# 左側 #}
      <div class="plan__list__content--left">
        {% for %}
        <img src="{{ 部品の画像 }}">
        {% endfor %}
      </div>
      {# 右側 #}
      <div class="plan__list__content--right">
        {# 品番 #}
        <div class="plan__list__content--right__column">
          <div>品番</div>
          <div>
            {% for %}
            {{ 部品の品番 }}
            {% endfor %}
          </div>
        </div>
        <hr class="plan__list__content__hr">
        {# 明細 #}
        <div class="plan__list__content--right__column">
          <div>明細</div>
          <div>
            {% for %}
            {{ 部品の明細 }}
            {% endfor %}
           </div>
        </div>
      </div>
    </div>
  </div>
  {% endfor %}
</section>

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+4

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • PHP

    21407questions

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

  • データベース

    737questions

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

  • Laravel

    715questions

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