You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 5中如何获取全部分类及分类下项目并展示表格?

嗨!我来帮你实现按分类展示下属项目的表格需求。首先你的现有代码存在N+1查询问题(每个日程都单独查一次分类,效率很低),我们先优化这个问题,再把数据按分类分组,最后在视图里渲染成表格。具体步骤如下:

1. 给Schedule模型添加关联关系

首先在你的Schedule模型(注意你代码里的schedual应该是拼写错误,正确是Schedule)中定义和Specialism模型的关联:

// app/Models/Schedule.php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Schedule extends Model
{
    // 假设你的表名是schedules,外键是specialism_id
    public function specialism()
    {
        return $this->belongsTo(Specialism::class);
    }
}

2. 控制器中查询并分组数据

接下来修改index方法,使用**预加载(Eager Loading)**避免N+1查询,然后按分类名称分组:

public function index()
{
    // 预加载关联的specialism,一次性获取所有分类数据,避免循环里多次查询
    $schedules = \App\Models\Schedule::with('specialism')->get();
    
    // 按分类名称分组,得到以分类名为键、对应日程数组为值的集合
    $groupedSchedules = $schedules->groupBy('specialism.name');
    
    // 把分组后的数据传给视图
    return view('你的视图名称', compact('groupedSchedules'));
}

3. 在视图中渲染分类表格

最后在Blade视图里循环分组后的数据,每个分类对应一个表格:

{{-- 你的Blade视图文件 --}}
@foreach($groupedSchedules as $specialismName => $categorySchedules)
    <h3>{{ $specialismName }}</h3>
    <table border="1" cellpadding="8" cellspacing="0">
        <thead>
            <tr>
                <th>日程ID</th>
                <th>日程名称</th>
                {{-- 这里添加你需要展示的其他日程字段 --}}
            </tr>
        </thead>
        <tbody>
            @foreach($categorySchedules as $schedule)
                <tr>
                    <td>{{ $schedule->id }}</td>
                    <td>{{ $schedule->name }}</td>
                    {{-- 其他字段同理 --}}
                </tr>
            @endforeach
        </tbody>
    </table>
    <br>
@endforeach

补充说明

  • 如果你的模型命名或表结构有差异,比如Specialism模型的表名不是specialisms,可以在关联方法里指定表名和外键:return $this->belongsTo(Specialism::class, 'specialism_id', 'id');
  • 预加载是Laravel里优化查询的常用手段,能大幅提升数据获取效率,尤其是数据量较大时。

内容的提问来源于stack exchange,提问作者hala

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:34:09