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

Laravel如何用GroupBy优化Blade多循环任务状态展示?求最优方案

优化Laravel任务列表的遍历与分组展示

问题背景

当前实现中,控制器查询出部门所有任务后,视图需要两次遍历全部任务集合,分别筛选status=1和status=2的任务展示,这种方式会遍历大量非目标状态的任务,效率较低。同时希望能优雅处理分组为空的情况,尽量保持代码简洁。

原控制器代码:

$tasks = Task::where('department', '=', $department)
->orderBy('created_at', 'DESC')
->get();

原视图代码:

@foreach($tasks as $task)
@if($task->status == 1)
<tr>
    <td class="cell">#{{ $task->id }}</td>
    <td class="cell">{{ $task->title }}</td>
</tr>
@endif
@endforeach

LOT OF HTML

@foreach($tasks as $task)
@if($task->status == 2)
<tr>
    <td class="cell">#{{ $task->id }}</td>
    <td class="cell">{{ $task->title }}</td>
</tr>
@endif
@endforeach

优化方案

方案1:集合分组(单次数据库查询)

在控制器中利用Laravel Collection的groupBy方法,将查询结果按status分组,视图可直接获取对应状态的任务集合,避免重复遍历全量数据。

控制器代码:

$tasks = Task::where('department', $department)
    ->orderBy('created_at', 'DESC')
    ->get()
    ->groupBy('status');

视图代码(使用forelse处理空状态):

{{-- 展示status=1的任务 --}}
@forelse($tasks->get(1, collect()) as $task)
<tr>
    <td class="cell">#{{ $task->id }}</td>
    <td class="cell">{{ $task->title }}</td>
</tr>
@empty
<tr>
    <td colspan="2" class="cell">暂无状态为1的任务</td>
</tr>
@endforelse

<!-- LOT OF HTML -->

{{-- 展示status=2的任务 --}}
@forelse($tasks->get(2, collect()) as $task)
<tr>
    <td class="cell">#{{ $task->id }}</td>
    <td class="cell">{{ $task->title }}</td>
</tr>
@empty
<tr>
    <td colspan="2" class="cell">暂无状态为2的任务</td>
</tr>
@endforelse
  • $tasks->get(1, collect())确保当没有status=1的任务时返回空集合,避免报错
  • forelse自动处理空集合场景,无需额外判断,代码简洁且友好

方案2:分状态查询(两次数据库查询)

如果部门任务量极大,内存分组效率较低,可直接在控制器中分别查询对应状态的任务,视图直接遍历对应集合。

控制器代码:

$status1Tasks = Task::where('department', $department)
    ->where('status', 1)
    ->orderBy('created_at', 'DESC')
    ->get();

$status2Tasks = Task::where('department', $department)
    ->where('status', 2)
    ->orderBy('created_at', 'DESC')
    ->get();

视图代码:

@forelse($status1Tasks as $task)
<tr>
    <td class="cell">#{{ $task->id }}</td>
    <td class="cell">{{ $task->title }}</td>
</tr>
@empty
<tr>
    <td colspan="2" class="cell">暂无状态为1的任务</td>
</tr>
@endforelse

<!-- LOT OF HTML -->

@forelse($status2Tasks as $task)
<tr>
    <td class="cell">#{{ $task->id }}</td>
    <td class="cell">{{ $task->title }}</td>
</tr>
@empty
<tr>
    <td colspan="2" class="cell">暂无状态为2的任务</td>
</tr>
@endforelse
  • 此方案减少内存处理压力,但会增加一次数据库查询,适合数据量极大的场景

总结

推荐优先使用方案1,仅需单次数据库查询,通过集合分组避免重复遍历,同时用forelse优雅处理空状态,代码简洁且性能高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 19:44:51