在我的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
实体。 Section与Thread有一对多的关系,我不是要求提供任何信息,所以老实说我不知道它来自何处。
我觉得我在这里遗漏了一些东西,或者我对此的态度是错误的。我想我可以使用Author
实体的存储库方法从给定的帖子中获取作者详细信息并从中构建响应,但也许有一种方法可以在单个查询中获取此数据?