过滤实体中的一对多连接

时间:2019-05-20 12:40:09

标签: filter api-platform.com

我有一个实体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;
    }

是否有更好的方法来实现它?

谢谢

1 个答案:

答案 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');
    }
...