Задать вопрос

Как правильно сериализовать данные, полученные из бд в Symfony со джойнами?

Задача в общем виде такая: победить проблему 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);
  • Вопрос задан
  • 62 просмотра
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы