Задача в общем виде такая: победить проблему n+1 при загрузки данных из бд сущности с полями один ко многим.
На примере таблицы user(id, username, location_id), и таблицы location(id, name).
Получаю данные так(в репозитории):
public function get(): mixed
{
$queryBuilder = $this->createQueryBuilder('u');
$queryBuilder->select('u')
->leftJoin(Location::class, 'l', 'WITH', 'l.id = u.location');
return $queryBuilder->getQuery()->getResult();
}
Естественно при обращении к $user->getLocation() происходит доп запрос в бд, в таблицу Location, даже при наличии джойна.
Далее подглядел вот такое получение связанных записей:
public function get(): mixed
{
$queryBuilder = $this->createQueryBuilder('u');
$queryBuilder->select('u', 'l')
->leftJoin(Location::class, 'l', 'WITH', 'l.id = u.location');
return $queryBuilder->getQuery()->getResult();
}
Класс, подзапросов не происходит, данные подгружаются сразу из джойна. Но есть одно но:
$users = $repository->get();
dd($users);
// OUTPUT:
array:74 [
0 => App\Entity User {id: 1, username: "admin", location: Proxies\__CG__\App\Entity},
1 => Proxies\__CG__\App\Entity\Location
]
Т е запрос возвращает в перемешку User и Location.
Как мне отдать $users клиенту без Proxies\Location?
В моем первом случае я отдавал данные вот так:
$attributes = [
'attributes' => [
'id',
'username',
'location' => ['id', 'name'],
]
];
$response_data = $serializer->normalize($users, true, $attributes);
return $this->json($response_data);