如何根据首字母在视图中显示记录?

inc*_*ick 4 model-view-controller laravel eloquent laravel-blade

在我的控制器中,我将一系列按字母顺序排列的类别传递给视图,如下所示:

public function index()
    {
        $categories = Category::orderBy('name', 'asc')->get();

        return view('categories')->with('categories',$categories);
    }
Run Code Online (Sandbox Code Playgroud)

在我看来,我想在与字母表中的字母相对应的单独列中显示这些类别中的每一个,因此在“A”列中,我将拥有以 A 开头的所有类别,依​​此类推。

是否可以按字母过滤视图中的结果以实现此目的,如果是,如何进行?

You*_*neL 6

您可以在控制器中按第一个字母对类别列表进行分组,然后将结果传递给您的视图,方法如下:

控制器:

public function index() {

    $categories = Category::orderBy('name', 'asc')->get();

    $groups = $categories->reduce(function ($carry, $category) {

        // get first letter
        $first_letter = $category['name'][0];

        if ( !isset($carry[$first_letter]) ) {
            $carry[$first_letter] = [];
        }

        $carry[$first_letter][] = $category;

        return $carry;

    }, []);

    return view('categories')->with('groups', $groups);
}
Run Code Online (Sandbox Code Playgroud)

看法:

@foreach($groups as $letter => $group)

    <ul>

        <li>{{ $letter }}</li>

        @foreach($group as $category)

            <li>{{ $category['name'] }}</li>

        @endforeach

    </ul>

@endforeach
Run Code Online (Sandbox Code Playgroud)

这是一个使用array_reduce的工作示例(它与上面的Collection::reduce函数相同)