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

Как правильно вернуть массив из Repository в Symfony 4.1?

Всем привет. Пишу "учебный" проект на Symfony 4.1

Вопрос:
Есть Entity со всеми связями (App\Entity\Ticket), где есть getUser(), getAnswers() и так далее.

Есть репозиторий, который по некому ID возвращает Ticket.

Есть фронтенд на Vue, который этот тикет рендерит. Как вы поняли, у меня все общение с клиентом построено на JSON.
Я могу через symfony/serializer преобразовать объект в массив, но как убрать эту прослойку?
Мне эти лишние накладные расходы ни к чему, я просто хочу написать:
$repository->findAsArray($id);
и получить массив со всеми связями:
$ticket = [
      'id' => 100,
      'name' => 'ticket',
      'user' => [...],
      'answers' => [...]
]


Я могу легко сделать такой массив руками, получив данные через QueryBuilder. Я могу сериализовать объект. Но есть ли такая возможность сделать это автоматически и не формировать массив руками и не получить расходов при сериализации? Какой правильный путь в Symfony для этого?
  • Вопрос задан
  • 504 просмотра
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
Minifets
@Minifets
Hello world!!!
Какой правильный путь в Symfony для этого?


Правильный путь, это использовать serializer.
Не знаю почему у вас такие сомнения в производительности этого инструмента. Т.к. у него есть даже кеширование при работе с сущностями доктрины.

Если просто из любопытства, то прослойку действительно можно убрать.

Таким образом
/**
 * Примерная реализация метода получения билета по id
 * 
 * @param int $id
 * @return array|null
 * @throws \Doctrine\ORM\NonUniqueResultException
 */
public function findAsArray(int $id): ?array
{
    return $this->createQueryBuilder('t')
        ->select('t, u, a')
        ->join('t.user', 'u')
        ->join('t.answers', 'a')
        ->andWhere('t.id = :id')
        ->setParameter('id', $id)
        ->getQuery()
        ->getOneOrNullResult(\Doctrine\ORM\AbstractQuery::HYDRATE_ARRAY);
}

Ответ написан
Комментировать
Ваш ответ на вопрос

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

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