LoginSignup
souwasora
@souwasora (takei souwa)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

laravel foreach文での表示

解決したいこと

現在Laravelでファッション閲覧サイトを作成しています。
image.png
↑みたいな感じにブランド一覧画面でAから始まるブランドはAの中にといった表示をしたいのですが、、
どのようにして?何をすれば?
全くわからない為教えてください
解決方法を教えて下さい。

発生している問題・エラー

該当するソースコード

public function brand()
    {
        $brands=DB::table('brands')->orderBy('name','asc')->get();
        
       
        return view('home.brand',compact('brands'));
    }

    public function brand_show($id)
    {
        $brands = Brand::find($id);
        
        $items = item::where('name','like', '%' .$brands->name. '%')->get();
        return view('home.brand_show',compact('brands','items'));
    }

追記
@ha9e
ご返信ありがとうございます。
参考にさせて頂きました。
image.png

[DITA][OFF-WHITE]という2つのブランドをひとまず作っていたので
データは持ってこれてるのですが、viewで

@foreach (brandsasbrandsasbrand)
{{$brand->name}}
@endforeach

記述すると
image.png

と言われてしまいます。なぜなのでしょうか?

自分で試したこと

どのようにして表示させればいいのか分かりません

0

1Answer

CollectionのgroupByを利用してブランド名の頭文字で
グループ分けしてみたらどうでしょうか。

$brands=DB::table('brands')->orderBy('name','asc')->get();

$brands = $brands->groupBy(function ($brand) {
    // ブランド名の頭文字を取得
    $initials = mb_substr($brand->name, 0, 1);

    // アルファベットのグループ
    if (ctype_alpha($initials)) {
        // 先頭小文字の場合もあるため大文字に変換して判定する
        return Str::upper($initials);
    }

    // 数字の場合「0-9」のグループ
    if (is_numeric($initials)) {
        return '0-9';
    }

    return 'その他';
});

$brands = collect(range('A', 'Z'))->push('0-9')
                                ->push('その他')
                                ->flip()
                                ->map(function () { return null; })
                                ->merge($brands);

0Like

Comments

  1. @souwasora

    Questioner
    @ha9e様
    回答ありがとうございます。
    参考にさせて頂きました。
    foreach($brands as $brand)
    {{ $brand->name}}
    @endforeach
    がエラーになるのはなぜなのでしょうか?
    質問ばかりですみません、。
  2. 2次元配列になってますので、二重に回さないといけません。

    質問された記述では$brand変数にはブランド一覧が格納されていますので、
    Collectionにたいして$nameは取得できませんのでエラーになっています。

    下記サンプルです。
    またdd()したキャプチャでは、nullになっているものがあるので@continueでスキップさせます。
    ```php
    @foreach($brands as $initial => $group)
    <h3>{{ $initial }}</h3>
    @continue(blank($group))
    @foreach($group as $brand)
    {{ $brand->name }}
    @endforeach
    @endforeach
    ```
  3. 将来的にスピードを意識するなら、毎回計算させるのではなく
    initialsテーブルを作成してbrands作成時に頭文字判別してinitialsとリレーションしたほうがいいと思います。
    判別方法は↑で私が記述した方法で判別出来るかと思います。

    initialsテーブルとリレーションした場合、取得時の記述がシンプルになるのと
    毎回ブランドの頭文字で表示場所を計算しなくてすむので非常にいいです。
    $initials = Initial::with('brands')->get();
    @foreach($initials as $initial)
    <h3>{{ $initial->name }}</h3>
    @foreach($initial->brands as $brand)
    {{ $brand->name }}
    @endforeach
    @endforeach
  4. @souwasora

    Questioner
    @ha9e様
    返信ありがとうございます。
    実施してみたいと思います。
    丁寧に対応ありがとうございます!!

Your answer might help someone💌