Symfony Query Builder ошибка частичной выдачи запроса при циклической ссылке - PullRequest
0 голосов
/ 30 апреля 2018

В моем приложении Symfony 4 есть конечная точка API, из которой мне нужна информация о последних Post из заданных Thread и Author этого конкретного Post. Это должна быть структура ответа

lastPost: {
  id: 1,
  createdAt: 2018-04-30
  author: {
    id: 1
    nick: 'admin
  }

Я попытался вернуть это из метода хранилища в моем PostRepository, используя $this->json->($response).

public function findLastPostByThreadId($threadId)
    {
        return $this->createQueryBuilder('p')
            ->select('p.id, p.createdAt')
            ->addSelect('author.id, author.nick')
            ->innerJoin('p.author', 'author')
            ->where('p.thread = :threadId')
            ->setParameter('threadId', $threadId)
            ->orderBy('p.createdAt', 'DESC')
            ->setMaxResults(1)
            ->getQuery()
            ->getOneOrNullResult();
    }

Но если я это сделаю, поле post.id будет перезаписано на author.id, а ответ не будет иметь необходимой структуры.

Затем я попытался переписать этот запрос для запроса частичных объектов:

public function findLastPostByThreadId($threadId)
    {
        return $this->createQueryBuilder('p')
            ->select('p.id, p.createdAt')
            ->addSelect('partial author.{id, nick}')
            ->innerJoin('p.author', 'author')
            ->where('p.thread = :threadId')
            ->setParameter('threadId', $threadId)
            ->orderBy('p.createdAt', 'DESC')
            ->setMaxResults(1)
            ->getQuery()
            ->getOneOrNullResult();
    }

но потом выдает ошибку Cannot select entity through identification variables without choosing at least one root entity alias.

Когда я пытаюсь сделать этот запрос полностью основанным на частичных объектах

public function findLastPostByThreadId($threadId)
{
    return $this->createQueryBuilder('p')
        ->select('partial p.{id, createdAt}')
        ->addSelect('partial author.{id, nick}')
        ->innerJoin('p.author', 'author')
        ->where('p.thread = :threadId')
        ->setParameter('threadId', $threadId)
        ->orderBy('p.createdAt', 'DESC')
        ->setMaxResults(1)
        ->getQuery()
        ->getOneOrNullResult();
}

я получаю Uncaught Exception: A circular reference has been detected when serializing the object of class "App\Entity\Section" (configured limit: 1), даже если я не запрашиваю Section сущность. Секция имеет отношение один-ко-многим с Thread, и я не запрашиваю никакой информации об этом, поэтому я, честно говоря, понятия не имею, откуда это исходит.

Мне кажется, что я что-то здесь упускаю или мой подход к этому неверен. Я думаю, я мог бы использовать метод репозитория объекта Author, чтобы получить сведения об авторе из данного поста и построить ответ на него, но, возможно, есть способ получить эти данные в одном запросе?

...