В моем приложении 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
, чтобы получить сведения об авторе из данного поста и построить ответ на него, но, возможно, есть способ получить эти данные в одном запросе?