首页 > 解决方案 > 如何在 laravel 中自定义分页以显示每个页面的多个元素

问题描述

我的应用程序基本上为某些用户生成报告我从数据库中获取行每行包含一个“名称”和“工作时间”以及其他......每个用户都有多个具有相同名称但不同工作时间值的行我计算了刀片中的“工作时间”总数取决于下一行如果它的名称相同,我将继续添加工作时间,如果下一行是另一个用户,那么我将显示当前用户的总数并开始计算下一个用户的总数我的问题是分页:在每个页面的末尾,同一用户的行并没有全部出现,我的刀片逻辑只计算该页面上出现的内容(见图)

在此处输入图像描述

注意这里第二页中存在其他同名的行,它们的总数是分开计算的 在此处输入图像描述

是否有任何方法可以告诉分页器在除该数字之外的条件下设计行,->paginate(15+condition)因为我希望特定用户的所有行都保留在同一页面上。

这是查询:

$shifts = DB::table('driver_shifts')
        ->join('drivers','drivers.PermitNumber','=','driver_shifts.driver_badge_id')
        ->where ('driver_shifts.shift_start_time','>',$startDate)
        ->where ('driver_shifts.shift_start_time','<',$endDate)
        ->orderby('drivers.LastName')
        ->orderby('driver_shifts.shift_start_time')
        ->paginate(20)
        ->appends(request()->query());

这是表内的刀片逻辑。Ps:我知道这不是一个好习惯,但我在控制器中找不到更好的方法:

$total_time = 0.00;
$break_time = 0.00;
$work_time = 0.00;
for ($i = 0; $i < count($shifts); $i++)
{
    $break_time_item = $shifts[$i]->total_time - $shifts[$i]->work_time;
    echo '<tr>';
    echo '<td>' . $shifts[$i]->FirstName . ' ' . $shifts[$i]->LastName . '</td>';
    echo '<td>' . $shifts[$i]->vehicle_id . '</td>';
    echo '<td>' . $shifts[$i]->shift_start_time . '</td>';
    echo '<td>' . $shifts[$i]->shift_end_time . '</td>';
    echo '<td>' . $shifts[$i]->total_time . '</td>';
    echo '<td>' . $break_time_item . '</td>';
    echo '<td>' . $shifts[$i]->work_time . '</td>';
    echo '</tr>';
    //calculation totals for the current driver
    //dd($shifts[$i]->break_time);
    $total_time = $total_time + $shifts[$i]->total_time;
    $work_time = $work_time + $shifts[$i]->work_time;
    if (isset($shifts[$i + 1]))
    {
        if ($shifts[$i]->LastName !== $shifts[$i + 1]->LastName)
        {
            //calculating break time
            $break_time = $total_time - $work_time;
            //converting minutes to houres
            $total_time_hours = floor($total_time / 60);
            $total_time_min = $total_time - ($total_time_hours * 60);

            $work_time_hours = floor($work_time / 60);
            $work_time_min = $work_time - ($work_time_hours * 60);

            $break_time_hours = floor($break_time / 60);
            $break_time_min = $break_time - ($break_time_hours * 60);
            echo '<tr class="table-primary text-uppercase ">';
            echo '<td colspan="4">' . $shifts[$i]->FirstName . ' ' . $shifts[$i]->LastName . ' TOTAL ' . '</td>';

            if ($total_time_hours == 0 && $total_time_min == 0)
            {
                echo '<td>-</td>';
            }
            else
            {
                echo '<td>' . $total_time_hours . "h:" . $total_time_min . "min" . '</td>';
            }

            if ($break_time_hours == 0 && $break_time_min == 0)
            {
                echo '<td>-</td>';
            }
            else
            {
                echo '<td>' . $break_time_hours . "h:" . $break_time_min . "min" . '</td>';
            }

            if ($work_time_hours == 0 && $work_time_min == 0)
            {
                echo '<td>-</td>';
            }
            else
            {
                echo '<td>' . $work_time_hours . "h:" . $work_time_min . "min" . '</td>';
            }
            echo '</tr>';
            $total_time = 0;
            $break_time = 0;
            $work_time = 0;
        }
    }

标签: phpmysqllaravelpaginationlaravel-blade

解决方案


推荐阅读