вы утверждайте что проблема производительности в двунаправленных связях, но это не проблема, вы тем самым вводите других в заблуждение.
По-умолчанию если сущность содержит двунаправленные связи и вы например делайте findAll() то доктрина вам отдаст только поля сущности без связей! Проверьте это и убедитесь что там будет только 1 select запрос.
Вы даже не предоставили код сущности и разметки маппинга чтобы доказать что двунаправленные связи работают неверно.
//$qparametrizer - кастомный класс, забирающий параметры выборки из клиентского запроса
$queryBulder = $repo->createQueryBuilder('a');
$query = $queryBulder->getQuery();
$items = new Paginator($query);
$itemsCount = count($items);
$pagesCount = ceil($itemsCount / $qparametrizer->getLimit());
$data = $items
->getQuery()
->setFirstResult($qparametrizer->getOffset())
->setMaxResults($qparametrizer->getLimit())
->getResult()
;
return $this->json([
'data' => $data,
]);
class CircularReferenceHandler
{
public function __invoke($object) {
return $object;
}
}
if (strpos($event->getRequest()->getPathInfo(), '/api/') === 0)
<?php
namespace App\Repository;
use Doctrine\DBAL\Connection;
class AnalyticsRepository
{
public function __construct(
protected Connection $connection
)
{
}
public function countRegistered(int $begin, int $end)
{
$query = $this->connection->createQueryBuilder()
->select('x.action_id, COUNT(x.user_id) as result')
->from('user_action_xref', 'x')
->join('x', 'user', 'u', 'x.user_id=u.id')
->addGroupBy('x.action_id');
if ($begin) {
$query
->andWhere('u.created_at >= :begin')
->setParameters(compact('begin'))
;
}
if ($end) {
$query
->andWhere('u.created_at <= :end')
->setParameters(compact('end'))
;
}
return $query->fetchAllKeyValue();
}
}