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

Laravel会话购物车数组去重:解决Blade中尺码重复显示问题

Laravel会话购物车重复尺码显示问题解决方案

问题根源

会话内color_items数组中存在多个size值相同的条目,Blade模板遍历所有条目时,会重复渲染同一个尺码名称。


方法一:控制器层预处理数据(推荐)

在控制器中提前对尺码数据去重,同时解决循环查询数据库的N+1性能问题:

// 处理会话中的购物车数据
foreach (session('cart', []) as &$item) {
    // 提取所有唯一的尺码ID
    $uniqueSizeIds = collect($item['color_items'])->pluck('size')->unique()->values();
    
    // 批量查询尺码名称,避免多次数据库请求
    $sizeNames = \App\Models\Size::whereIn('id', $uniqueSizeIds)->pluck('name');
    
    // 将去重后的尺码名称存入购物车项
    $item['unique_sizes'] = $sizeNames;
}
unset($item); // 解除引用

Blade模板直接渲染去重后的尺码:

<dl class="card-item-desc-1">
    <dt>Size:</dt>
    @foreach($details['unique_sizes'] as $sizeName)
        <dd>{{ $sizeName }}</dd>
    @endforeach
</dl>

方法二:Blade模板内直接处理(临时方案)

若不想修改控制器,可在模板中通过集合方法去重,同时优化查询:

<dl class="card-item-desc-1">
    <dt>Size:</dt>
    @php
        // 提取唯一尺码ID并批量查询
        $uniqueSizeIds = collect($details['color_items'])->pluck('size')->unique();
        $sizeNames = \App\Models\Size::whereIn('id', $uniqueSizeIds)->pluck('name');
    @endphp
    @foreach($sizeNames as $sizeName)
        <dd>{{ $sizeName }}</dd>
    @endforeach
</dl>

关键优化点

原模板中foreach循环内调用Size::find()会触发多次数据库查询,上述两种方法都使用whereIn批量查询,大幅减少数据库请求次数,提升页面性能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 23:20:28