MVCアーキテクチャのオリジナルフレームワークを使用した案件開発ですが、他のMVCフレームワークでも当てはまるかと思います。
日頃からループの回数を減らすべく意識しているのですが、表題とおりViewからDBを参照する是非について頭を悩ましています。
コーディングというよりも、施策についての質問です。
作成しようとする画面
stdClassのオブジェクト変数「$orderList」があり、中身は以下のようなイメージです。
その中の「lists」プロパティをループさせて、tableタグによる一覧を作成します。
またその中の「order_number」をキーにDBテーブル「order_status」をSELECTし、値を表示させます。
PHP
1// $orderList 2stdClass Object 3( 4 [customer_no] => 1 5 [lists] => Array 6 ( 7 [0] => stdClass Object 8 ( 9 [order_number] => 10000 10 [kubun] => 見積 11 ) 12 [1] => stdClass Object 13 ( 14 [order_number] => 10001 15 [kubun] => 見積 16 ) 17 ) 18)
↓ order_statusテーブル
order_number | status |
---|---|
10000 | 了承 |
10001 | 査定中 |
↓こんな一覧を画面で表示させる
注文番号 | 区分 | ステータス |
---|---|---|
10000 | 見積 | 了承 |
10001 | 見積 | 査定中 |
※$orderList変数の中にstatusを含めたいところですが、仕様のため含められません。
MVCアーキテクチャですので、データ処理などビジネスロジックはモデルに、ビューとモデルの連携をコントローラが行うルールで開発していますが、やろうと思えばビューからモデルのクラスを呼び出すことは可能です。
悩んでいる箇所
以下の案①か案②で行うか悩んでおります。
案①:DBへの問合せを1回にする
DBの問合せを1回で済ますには以下のようになるかと思いますが、ループが3回発生します。
1. $orderList->lists をループさせ、order_numberを取り出す
PHP
1foreach ($orderList->lists as $key => $val) { 2 $orderNumbers[] = $val->order_number; 3}
2. $orderNumbers配列を使ってクエリを組み立て、order_statusテーブルの値を得る
PHP
1// ------------------------ 2// Modelにてデータを生成 3// ------------------------ 4$sql = 'SELECT ' 5 . ' order_number ' 6 . ',status ' 7 . ' FROM ' 8 . ' order_sutatus ' 9 . ' WHERE ' 10 . ' order_number in (' . implode(',', $orderNumbers) . ')'; 11 12// DBクラスでSQLを実行し、結果を配列で取得する。 13$buff = Db::fetchAll($sql); 14 15if (!empty($buff)) { 16 foreach ($buff as $key => $val) { 17 // order_number を配列のキーとする 18 $orderStatus[ $val['order_number'] ] = $val['status']; 19 } 20} 21 22// 作られる $orderStatus 配列はこんなイメージ 23// $orderStatus[10000] ... "了承" 24// $orderStatus[10001] ... "査定中" 25
3. tableタグの一覧を生成する
PHP
1// ------------------------ 2// Viewにて画面を生成 3// ------------------------ 4$html = '<table>' 5 . '<tr>' 6 . ' <td>注文番号</td>' 7 . ' <td>区分</td>' 8 . ' <td>ステータス</td>' 9 . '</tr>'; 10 11foreach ($orderList->lists as $key => $val) { 12 $html .= '<tr>' 13 . '<td>' . $val->order_number . '</td>' // 注文番号 14 . '<td>' . $val->kubun . '</td>' // 区分 15 . '<td>' . $orderStatus[ $val->order_number ] . '</td>' // ステータス 16 . '</tr>'; 17} 18 19$html .= '</table>';
案②:tableを作成するループ内でDBに問合せする
ループは1回だけで済みますが、DBへの問合せが件数ぶん発生しますし、ViewからModelを呼び出すのでMVCアーキテクチャの意味から外れる感じがします。
PHP
1// ------------------------ 2// Viewにて画面を生成 3// ------------------------ 4$html = '<table>' 5 . '<tr>' 6 . ' <td>注文番号</td>' 7 . ' <td>区分</td>' 8 . ' <td>ステータス</td>' 9 . '</tr>'; 10 11foreach ($orderList->lists as $key => $val) { 12 // OrderStatusクラス(model)のメソッドを使って、statusを取得 13 $status = OrderStatus::getStatus($val->order_number); 14 15 $html .= '<tr>' 16 . '<td>' . $val->order_number . '</td>' // 注文番号 17 . '<td>' . $val->kubun . '</td>' // 区分 18 . '<td>' . $status . '</td>' // ステータス 19 . '</tr>'; 20} 21 22$html .= '</table>';
長々となりましたが、「うちの開発ルールではこうしている」とか「気にしていない」など、ご教示いただけますと助かります。
以上、よろしくお願いいたします。
回答4件
あなたの回答
tips
プレビュー