#php #mysql #laravel #dbal
#php #mysql — сервер #laravel #dbal #mysql
Вопрос:
У нас возникли проблемы с определенным запросом к базе данных в 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', $year)
->where('week', $week);
$employeeRentInWeek = $employeeCollectionsInWeek
->where('type', 'rent');
$employeeAdditionInWeek = $employeeCollectionsInWeek
->where('type', 'addition');
$employeeCollectionsUpToWeek = $employee->collections
->filter(function ($collection) use ($year, $week) {
return ($collection->year == $year amp;amp; $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', ['rent', 'addition'])->sum('amount');
$totalPaidInWeek = $employeeCollectionsInWeek->whereIn('type', ['payment_cash', 'payment_card', 'payment_transfer', 'payment_tikkie', 'remission'])->sum('amount');
$weeks[$week]['week_balance'] = round($totalPaidInWeek - $totalToBePaidInWeek, 2);
}
}
$employee['weeks'] = $weeks;
}
return $employees;
}
С уважением,
Tom van der Hout, Dylan Vollebregt, Dayton de Lange amp; Daan Jansen
Комментарии:
1. Какую СУБД вы используете?
2. Мы используем MySQL
3. Используйте панель отладки. Я думаю, что ваш код выполняет несколько запросов в каждом цикле foreach и в цикле for. Возможно, вам потребуется рефакторинг
4. Вы можете сделать это для нас? Я не понимаю. Большое вам спасибо. Laravel не самый простой из существующих. С уважением, Daan и Dayton 😘
5. вы индексируете свою таблицу?