Я пытаюсь провести проверку заряда с помощью веб-приложения Symfony. У меня есть сущность с 13 полями, включая 1 первичный ключ и 7 внешних ключей. Я ввел 40 тысяч данных.
Мой контроллер использует findAll() и KNP Paginator с максимум 10 строками на странице. Отображение страницы занимает много времени (от 15 до 30 секунд), вот результат моего профилировщика:
Показатели эффективности :
Я пробовал без родственных ключей, это лучше, но пока неприемлемо. Показатели эффективности :
Что вы порекомендуете для отображения большого количества данных с нумерацией страниц? Спасибо за помощь.
Хорошего дня.
<?php
namespace App\Controller\Admin;
use App\Repository\ChargeRepository;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class ChargeController extends AbstractController
{
#[Route('/admin/charge', name: 'app_admin_charge')]
public function index(ChargeRepository $repository, PaginatorInterface $paginator, Request $request): Response
{
$data = $paginator->paginate(
$repository->findAll(),
$request->query->getInt('page', 1),
10
);
// dd($myTickets);
return $this->render('admin/charge/index.html.twig', [
'data' => $data
]);
}
}






Согласно их документации, вы должны разбивать на страницы сам построитель запросов, а не результат findAll. Когда вы используете findAll, вы загружаете все объекты из базы данных и увлажняете их, это занимает много времени для 40 тысяч строк.
Что-то вроде этого уже могло помочь:
$data = $paginator->paginate(
$repository->createQueryBuilder('charge'),
$request->query->getInt('page', 1),
10
);
Используя этот код, пагинатор добавляет необходимое ограничение на нумерацию страниц к самому запросу базы данных, так что загружаются только те элементы, которые также отображаются на текущей странице.
Часть документации, часть чтения вашего кода
Выбор всех данных с помощью метода findAll() не является хорошей практикой, если у вас большое количество данных. Попробуйте использовать пользовательскую нумерацию страниц с помощью firstResult и maxResults. Вот пример:
/**
* @param int $page
* @param int $maxResults
* @return Charge[]
*/
public function getPaginated(int $page = 1, int $maxResults = 50): array
{
return $this->createQueryBuilder('c') // add where clauses if you need
->setFirstResult(($page - 1) * $maxResults)
->setMaxResults($maxResults)
->getQuery()
->getResult();
}
Святое решение, спасибо вам огромное. Я пробовал с данными 80 тыс., страница загружалась за 200 мс :о. Спасибо за объяснение, вы нашли эту информацию в документации по доктрине или в документе KNP?