微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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 举报,一经查实,本站将立刻删除。