我有一个实体User,它与问题具有一对多联系。问题与答案之间存在一对多联系。问题和答案实体每个都有一个称为状态的属性。
通常,在执行GET请求后,API平台会返回所有用户以及所有问题,包括所有答案。很好!
现在,我想实现一个get请求,该请求返回具有特定状态(例如“ X”)的所有问题的用户。问题只应包含状态相同(“ X”)的答案。
我使用了过滤功能(用于过滤所有不必要的数据)
因此,我生成了一个名为GetUserObjectAction的控制器,该控制器具有以下功能
public function __invoke(PaginatorInterface $data, Request $request): PaginatorInterface
{
$repo = $this->managerRegistry->getRepository(Question::class);
foreach ($data as $value) {
$q = $value->getQuestions()->filter(function($q1) {
if($q1->getState() === 'a') {
$q1->values = $q1->values->filter(function($a) {
return $a->getState() === 'a';
});
return true;
} else {
return false;
}
return ;
});
$value->setQuestions($int);
}
return $data;
}
是否有更好的方法来实现它?
谢谢
答案 0 :(得分:0)
您选择了正确的方法,因为您没有告诉我们如何管理您的数据(Doctorrine ORM / ODM,自定义数据提供者),我们无法告诉您更多信息。但是我建议您使用API平台默认值,因此您可以先过滤数据,然后再将其提取到QuestionRepository中,并忽略对数据的访问。
以下是示例:
QuestionRepository
...
public function findWithAnswersByState(string $state): array
{
$qb = $this->createQueryBuilder('q')
->join('q.answers', 'a')
->andWhere('q.state = :state')
->andWhere('a.state = :state')
->setParameter('state', $state);
return $qb->getQuery()->getResult();
}
...
控制器:
...
public function __invoke(PaginatorInterface $data, Request $request): PaginatorInterface
{
$repo = $this->managerRegistry->getRepository(Question::class);
return $repo->findWithAnswersByState('a');
}
...