Фильтрация соединений «один ко многим» в сущности - PullRequest
0 голосов
/ 20 мая 2019

У меня есть пользователь сущности, который имеет отношение один-ко-многим к вопросам.У вопросов есть связь один ко многим с ответами.Каждая сущность вопросов и ответов имеет свойство, называемое состоянием.

Обычно после выполнения запроса 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 голосов
/ 21 мая 2019

Вы выбрали правильный путь, потому что вы не сказали нам, как управляются ваши данные (Doctrine 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');
    }
...
...