API请求加载时间很长,问题出在哪里?

问题描述

我们在Laravel中遇到某些数据库查询的问题。有谁知道如何优化此代码以加快页面加载速度?我们有一个非常庞大的数据库,现在加载页面大约需要半分钟。

    public function index($year,int $weekStart,int $weekEnd)
{
    $employees = Employee::has('houses')
        ->with(['collections' => function ($collections) use ($year,$weekEnd) {
            $collections->where('year','=',$year)
                ->where('week','<=',$weekEnd)
                ->orWhere('year','<',$year);
        }])
        ->get(['id','identifier','firstname','insertion','lastname']);

    foreach ($employees as $employee) {
        $weeks = [];

        for ($week = $weekStart; $week <= $weekEnd; $week++) {
            $weeks[$week] = ['rent' => 0,'addition' => 0,'balance' => 0,'week_balance' => 0];

            $employeeCollectionsInWeek = $employee->collections
                ->where('year',$week);

            $employeeRentInWeek = $employeeCollectionsInWeek
                ->where('type','rent');

            $employeeAdditionInWeek = $employeeCollectionsInWeek
                ->where('type','addition');

            $employeeCollectionsUpToWeek = $employee->collections
                ->filter(function ($collection) use ($year,$week) {
                    return ($collection->year == $year && $collection->week <= $week) || $collection->year < $year;
                });

            if ($employeeRentInWeek->count()) {
                $weeks[$week]['rent'] = round($employeeRentInWeek->sum('amount'),2);
            }

            if ($employeeAdditionInWeek->count()) {
                $weeks[$week]['addition'] = round($employeeAdditionInWeek->sum('amount'),2);
            }

            if ($employeeCollectionsUpToWeek->count()) {
                $totalToBePaid = $employeeCollectionsUpToWeek->whereIn('type',['rent','addition'])->sum('amount');
                $totalPaid = $employeeCollectionsUpToWeek->whereIn('type',['payment_cash','payment_card','payment_transfer','payment_tikkie','remission'])->sum('amount');
                $weeks[$week]['balance'] = round($totalPaid - $totalToBePaid,2);
            }

            if ($employeeCollectionsInWeek->count()) {
                $totalToBePaidInWeek = $employeeCollectionsInWeek->whereIn('type','addition'])->sum('amount');
                $totalPaidInWeek = $employeeCollectionsInWeek->whereIn('type','remission'])->sum('amount');
                $weeks[$week]['week_balance'] = round($totalPaidInWeek - $totalToBePaidInWeek,2);
            }
        }

        $employee['weeks'] = $weeks;
    }

    return $employees;
}

亲切的问候,

汤姆·范德豪特(Tom van der Hout),迪伦·沃勒布雷格(Dylan Vollebregt),代顿·德朗格(Daton de Lange)和达恩·詹森(Daan Jansen)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...