Laravelにおいて、原則は1テーブル=1モデルです。
会員テーブルがあって、それに紐づく形で「都道府県テーブル」や「サイトにたどり着いた経緯テーブル」が存在するなら、リレーションというものを使います。
https://readouble.com/laravel/5.5/ja/eloquent-relationships.html
都道府県の場合は1対1(←会員が住んでいる都道府県は必ず1つなので)、サイトにたどり着いた経緯なら1対1(←単一選択のみ)か1対多(←複数選択可)になると思います。
この場合、モデル自体はテーブルの数分だけ作らなければなりませんが、コントローラーから呼び出す時は、基本的には「会員テーブル」のモデルを呼出し、それ以外の関連テーブルは「会員テーブルモデル」経由で呼び出すことになります。
回答へのコメントを受けて追記。
すみません、上記の「リレーション」についての回答は、ご推察のとおり
1会員もしくは複数の会員に紐づくデータを表示させる
方法となっております。
選択肢を表示させる方法
(都道府県も、サイトにたどり着いた経緯も、
テーブルからすべてデータを取得して選択肢としてすべて表示する)
につきましては、もし、「都道府県マスタテーブル」と「サイトにたどり着いた経緯マスタテーブル」を持つのであれば、原則に則るのならば、回答へのコメントに書いていただいたように
// 都道府県マスタ
$prefectures = Prefecture::all(); // ←イメージ図。実際は「並べ替え」等の考慮が必要
// サイトにたどり着いた経緯マスタ
$site_visit_reasons = SiteVisitReason::all(); // ←イメージ図。実際は「並べ替え」等の考慮が必要
という形で並べることになります。
使うテーブルの数だけモデルを呼び出してインスタンスを作成するのは、
表示項目が多い場面だと、ズラッと処理が並ぶことになるので、
まとめることができるのではないかと思ったことです。
まとめたい理由次第かとは思うのですが、以下、想定される理由別に解決案を書いてみます。
想定される理由1)コントローラーに並べると可読性が悪くなるから「ユーザーのマスタ取得系」の処理をまとめたい
解決案1-1)
「サービス」という概念を使い、「ユーザーのマスタ取得」を1つのメソッドにしてしまえば、コントローラーはスッキリします。
https://qiita.com/minechan1234/items/2cc7c69875fafb2fdae9
解決案1-2)
もし、「サービスを導入するのはちょっと敷居が高い」ということであれば、コントローラー内のプライベートメソッドに切り出して、「ユーザー用のマスタ情報を1つの変数にまとめる」だけでも十分見やすくなると思います。
// ↓とあるコントローラークラスのメソッド
public function index()
{
// ~略~
$user_masters = $this->getUserMasters();
// ~略~
}
/**
* ユーザーのマスタ情報を取得
*/
private function getUserMasters()
{
$user_masters = [];
// 都道府県マスタ
$user_masters['prefectures'] = Prefecture::all(); // ←イメージ図。実際は「並べ替え」等の考慮が必要
// サイトにたどり着いた経緯マスタ
$user_masters['site_visit_reasons'] = SiteVisitReason::all(); // ←イメージ図。実際は「並べ替え」等の考慮が必要
return $user_masters;
}
想定される理由2)テーブルにアクセスする回数を減らしたい
コードの書き方を工夫したとしても、最終的に「各種テーブルにアクセスしなければならない」という点は変わりません。
解決案2-1)
https://qiita.com/sakuraya/items/42fffe0f171d49ee74a0#
のように、DBではなく設定ファイルに定義してしまうと、テーブルへのアクセスは不要になります。
なお、設定ファイルに定義した場合、コードの可読性が良くなるだけでなく、無駄なDBアクセスが発生しない=表示速度も速くなります。
その代わり、ちょっと選択肢を増やしたいだけの時にも、設定ファイルを修正しなければならなくなります。
解決案2-2)
「DBを使う」という点はそのままで、「会員マスタ系のテーブル」を「都道府県マスタ」「サイトにたどりついた経緯マスタ」で分割するのではなく「会員マスタテーブル」で一元管理すれば、1回のアクセスで複数のマスタ情報がまとめて取得できます。
■会員マスタサンプル(category_id=1が都道府県、2がサイトにたどり着いた経緯です)
category_id | branch_id | name |
---|
1 | 1 | 北海道 |
1 | 13 | 東京都 |
2 | 1 | 検索エンジンから |
2 | 2 | 知人にすすめられた |
⇒解決案として提示しておいて何ですが、この持ち方ですと、DBから取得した後にPHP側で扱いにくくなる&不測の事態が発生した時に困ります(例:セレクトボックスのvalueにあたる「branch_id」を数字で定義したのに、新項目は文字列にしなければならなくなった)。
そのため、積極的にはおススメしません。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/02/19 05:05
2019/02/20 08:20