FullCalendar重复数据问题:如何合并同时间同补剂的日程?
同一时间相同补剂仅显示单条日程的实现方案
完全可以实现,核心是按补剂和日期对记录进行分组,避免重复生成相同事件。以下是两种可行的实现方式:
方式一:PHP代码层面分组
先遍历原始数据,将同一日期、同一补剂的记录归为一组,再基于分组结果生成日历事件:
// 初始化分组数组 $groupedSupplements = []; foreach ($swimmerSupplements as $supplement) { // 生成唯一分组键:日期 + 补剂ID(用ID比名称更精准,避免同名补剂混淆) $groupKey = $supplement->date . '_' . $supplement->supplement->id; if (!isset($groupedSupplements[$groupKey])) { $groupedSupplements[$groupKey] = [ 'title' => $supplement->supplement->name, 'start' => $supplement->date, 'memberCount' => 1 // 记录需要服用该补剂的人数(可选) ]; } else { // 人数累加 $groupedSupplements[$groupKey]['memberCount']++; } } // 生成最终日历事件数组 $eventsSwimmerSupplement = []; foreach ($groupedSupplements as $item) { // 可选:在标题中添加人数提示,比如"钙2克(3人)" $displayTitle = $item['title']; // if ($item['memberCount'] > 1) { // $displayTitle .= '(' . $item['memberCount'] . '人)'; // } $eventsSwimmerSupplement[] = [ 'title' => $displayTitle, 'allDay' => true, 'start' => $item['start'], 'color' => 'red' ]; }
方式二:数据库查询阶段分组(更高效)
如果数据量较大,建议直接在数据库查询时完成分组,减少PHP层面的处理压力:
// 假设使用Laravel Eloquent,提前按日期和补剂ID分组并统计人数 $groupedSupplements = \App\Models\SwimmerSupplement::with('supplement') ->select('date', 'supplement_id', \Illuminate\Support\Facades\DB::raw('COUNT(*) as member_count')) ->groupBy('date', 'supplement_id') ->get(); // 生成日历事件 $eventsSwimmerSupplement = []; foreach ($groupedSupplements as $supplement) { $displayTitle = $supplement->supplement->name; // 可选:添加人数提示 // if ($supplement->member_count > 1) { // $displayTitle .= '(' . $supplement->member_count . '人)'; // } $eventsSwimmerSupplement[] = [ 'title' => $displayTitle, 'allDay' => true, 'start' => $supplement->date, 'color' => 'red' ]; }
两种方式都能确保同一日期、同一补剂仅生成一条日历事件,满足教练查看群体提示的需求。
内容的提问来源于stack exchange,提问作者Eva Burghoorn
相关产品推荐
相关产品推荐

