質問: $item -> pref) // DB上の都道府県名($pref -> name)とアイテムの都道府県($item -> pref)が一致した時 // ここに何か条件分岐を入れたいです。アイテムの都道府県が重複する場合、breakする、みたいな {{ $pref -> name }} // 東京都 @endif @endforeach {{ $item -> name }} // ●●● {{ $item -> pref }} {{ $item -> address }} // 東京都 渋谷区 @endforeach ``` 生成されるHTMLタグは以下のサイトで公開しています。 サイト上にあるように、見出しにあたる都道府県の名前は1度以上は登場させたくないので、 何かのIF文あるいはCOUNT文でforeachを1度だけ繰り返してbreakする、みたいなものを想像しているのですが、 その条件式として適切なものが思い浮かばずに困ったため、今回質問した次第です。何卒ご教授をお願いいたします。
回答: 仮に都道府県テーブルを`prefs`テーブル、アイテムテーブルを`items`テーブルとし、 それぞれに対応する`Pref`モデルと`Item`モデルを作るとします。 Prefモデルの中に、Itemモデルに対する1:多のリレーションを作ります。 itemsテーブルに`pref_id`にあたるカラムがあればいいのですが、どうやら無さそうに思えるので (あんまりいい方法ではありませんが)お互いのテーブルの`name`列を結合条件とします。 ``` public function items() { return $this->hasMany('App\Item', 'name', 'name'); } ``` モデルの定義をしたあとは ``` $prefs = Pref::with('items')->get(); ``` のように都道府県レコードをアイテムレコードと一緒に取得し、まとめてviewに送れば、 ``` foreach ($prefs as $pref) { // prefの表示とか foreach ($pref->items as $item) { // itemの表示とか } } ``` こんな感じで、外側のループは都道府県の回数、内側のループはその都道府県のアイテムで回せるので 重複して都道府県の出力が出ないようにできると思います。